home *** CD-ROM | disk | FTP | other *** search
/ PC World Interactive 7 / PC World Interactive 7.iso / program / dosref.EXE / CHAPTER.004 < prev    next >
Text File  |  1996-01-31  |  228KB  |  4,527 lines

  1.  
  2.    **  Programmer's Technical Reference for MSDOS and the IBM PC **
  3.  
  4.                        C H A P T E R    F O U R
  5.  
  6.  
  7.                    DOS INTERRUPTS AND FUNCTION CALLS
  8.  
  9.  
  10.                             C O N T E N T S
  11.  
  12. General Programming Guidelines .................................. 4**1
  13. DOS Registers ................................................... 4**2
  14. DOS Stacks ...................................................... 4**3
  15. DOS Interrupts .................................................. 4**4
  16. Interrupt 20h (Terminate) ....................................... 4**5
  17. DOS Services (quick list) ....................................... 4**6
  18. Calling the DOS Services ........................................ 4**7
  19. Version Specific Information .................................... 4**8
  20. Compatibility Problems With DOS 4.0+ ............................ 4**9
  21. PCjr Cartridge Support .......................................... 4**10
  22. eDOS 4.0 ........................................................ 4**11
  23. DOS Services in Detail .......................................... 4**12
  24.  
  25.  
  26. General Programming Guidelines .................................. 4**1
  27.  
  28.   Microsoft recommends avoiding the "old style" DOS 1.0 (01h-0Ch and
  29. 26h) system calls wherever possible.  Programmers are urged to use the
  30. "new style" (DOS 2.0+) handle calls instead.
  31.  
  32.   Do not use "undocumented" functions unless they are critical to your
  33. application and no other reasonable workaround can be found.  Remember
  34. that your programs may have to run under various versions of DOS, DOS
  35. clones such as Digital's DR-DOS, the OS/2 Compatibility Box, or Unix
  36. DOS Emulation Window.  Such environments or OS simulations do not
  37. always implement the undocumented calls.
  38.  
  39.   DOS 2.x and 3.x lack many of the enhancements found in later
  40. versions.  Your application should check the minimum required DOS
  41. version when specific features are required.  Do not test for a higher
  42. version than necessary or you will cause problems for machines running
  43. older versions of DOS, such as business machines which are seldom
  44. upgraded, laptops with DOS in ROM, etc.
  45.  
  46.   Direct disk access via hardware or the BIOS should be avoided
  47. unless your program will only be run on specific hardware or under
  48. certain circumstances.  Some versions of DOS 2.x treat their disks in
  49. a manner much like 3.x.  Some vendors added multiple DOS partitions or
  50. oversize drive support prior to the "official" 3.3 release.  Not all
  51. these systems work in the same way!  New-type SCSI or ESDI hard disk
  52. controllers do not always emulate all the standard BIOS calls.
  53.  
  54.  
  55. DOS Registers ................................................... 4**2
  56.  
  57.  DOS uses the following registers, pointers, and flags when it executes
  58. interrupts and function calls:
  59.  
  60. ┌──────────────────┬────────┬─────────────────────────────────────────┐
  61. │GENERAL REGISTERS │register│               definition                │
  62. │                  ├────────┼─────────────────────────────────────────┤
  63. │                  │   AX   │  accumulator                   (16 bit) │
  64. │                  │   AH   │  accumulator high-order byte   ( 8 bit) │
  65. │                  │   AL   │  accumulator low order byte    ( 8 bit) │
  66. │                  │   BX   │  base                          (16 bit) │
  67. │                  │   BH   │  base high-order byte          ( 8 bit) │
  68. │                  │   BL   │  base low-order byte           ( 8 bit) │
  69. │                  │   CX   │  count                         (16 bit) │
  70. │                  │   CH   │  count high order byte         ( 8 bit) │
  71. │                  │   CL   │  count low order byte          ( 8 bit) │
  72. │                  │   DX   │  data                          (16 bit) │
  73. │                  │   DH   │  date high order byte          ( 8 bit) │
  74. │                  │   DL   │  data low order byte           ( 8 bit) │
  75. ├──────────────────┼────────┼─────────────────────────────────────────┤
  76. │SEGMENT REGISTERS │register│               definition                │
  77. │                  ├────────┼─────────────────────────────────────────┤
  78. │                  │   CS   │  code  segment (16 bit)                 │
  79. │                  │   DS   │  data  segment (16 bit)                 │
  80. │                  │   SS   │  stack segment (16 bit)                 │
  81. │                  │   ES   │  extra segment (16 bit)                 │
  82. ├──────────────────┼────────┼─────────────────────────────────────────┤
  83. │INDEX REGISTERS   │register│               definition                │
  84. │                  ├────────┼─────────────────────────────────────────┤
  85. │                  │   DI   │  destination index (16 bit)             │
  86. │                  │   SI   │  source      index (16 bit)             │
  87. ├──────────────────┼────────┼─────────────────────────────────────────┤
  88. │POINTERS          │register│               definition                │
  89. │                  ├────────┼─────────────────────────────────────────┤
  90. │                  │   SP   │  stack       pointer (16 bit)           │
  91. │                  │   BP   │  base        pointer (16 bit)           │
  92. │                  │   IP   │  instruction pointer (16 bit)           │
  93. ├──────────────────┴────────┴─────────────────────────────────────────┤
  94. │FLAGS               AF, CF, DF, IF, OF, PF, SF, TF, ZF               │
  95. └─────────────────────────────────────────────────────────────────────┘
  96.  
  97.   These registers, pointers, and flags all work on the "lowest common
  98. denominator" 8088-8086 CPU.  DOS makes no attempt to use any of the
  99. special or enhanced instructions available on the later CPUs which will
  100. execute 8088 code, such as the 80186, 80286, 80386, or NEC V20, V30,
  101. V40, or V50.
  102.  
  103.   User registers except AX are preserved unless information is passed
  104. back to the register as indicated in specific function calls.
  105.  
  106.   For PC-MOS/386 on a 386 CPU, the task switching logic saves the
  107. upper half of the 32-bit registers and the complete FS and GS
  108. registers.
  109.  
  110.   The Intel 8088 processors supplied for the early IBM PCs were
  111. defective and did not handle the stack register properly on an INT
  112. instruction.  DOS 2.1 added extra logic around interrupt calls for
  113. stack handling; this is the major difference between 2.0 and 2.1.
  114.  
  115.  
  116. DOS Stacks ...................................................... 4**3
  117.  
  118.   When DOS takes control after a function call, it switches to an
  119. internal stack.  Registers which are not used to return information
  120. (other than AX) are preserved.  The calling program's stack must be
  121. large enough to accomodate the interrupt system - at least 128 bytes
  122. in addition to other interrupts.
  123.  
  124.  DOS actually maintains three stacks -
  125.  
  126. stack 1: 384 bytes (in DOS 3.1)
  127.          for functions 00h and for 0Dh and up, and for ints 25h and
  128.          26h.
  129.  
  130. stack 2: 384 bytes (in DOS 3.1)
  131.          for function calls 01h through 0Ch.
  132.  
  133. stack 3: 48 bytes (in DOS 3.1)
  134.          for functions 0Dh and above.  This stack is the initial stack
  135.          used by the int 21h handler before it decides which of the
  136.          other two to use.  It is also used by function 59h (get
  137.          extended error), and 01h to 0Ch if they are called during an
  138.          int 24h (critical error) handler.  Functions 33h (get/set
  139.          break flag), 50h (set process ID), 51h (get process ID) and
  140.          62h (get PSP address) do not use any DOS stack under DOS 3.x
  141.          (under 2.x, 50h and 51h use stack number 2).
  142.  
  143.   IBM and Microsoft made a change back in DOS 3.0 or 3.1 to reduce the
  144. size of DOS.  They reduced the space allocated for scratch areas when
  145. interrupts are being processed.  The default seems to vary with the
  146. DOS version and the machine, but 8 stack frames seems to be common.
  147. That means that if you get more than 8 interrupts at the same time,
  148. clock, disk, printer spooler, keyboard, com port, etc., the system will
  149. crash.  It usually seems to happen on a network.
  150.  
  151.   DOS 3.2 does some different stack switching than previous versions.
  152. The interrupts which are switched are 02h, 08h, 09h, 0Ah, 0Bh, 0Ch,
  153. 0Dh, 0Eh, 70h, 72h, 73h, 74h, 75h, 76h, and 77h.  DOS 3.2 has a
  154. special check in the initialization code for a PCjr and don't enable
  155. stack switching on that machine.  DOS 3.3 was changed so that no stack
  156. switching occurs on PC, PC-XT, or the PC Portable, and defaults to 9
  157. stacks of 128 bytes in an AT.
  158.  
  159.   Additional stacks can be allocated when DOS loads by using the
  160. STACKS= command in CONFIG.SYS.  These stacks are in addition to the
  161. 3 internal DOS stacks.  STACKS=16,256 means allow 16 interrupts to
  162. interrupt each other and allow 256 bytes for each for scratch area.
  163.  
  164.  
  165. DOS Interrupts .................................................. 4**4
  166.  
  167.   Microsoft recommends that a program wishing to examine or set the
  168. contents of any interrupt vector use the DOS function calls 35h and
  169. 25h provided for those purposes and avoid referencing the interrupt
  170. vector locations directly.
  171.  
  172.   DOS reserves interrupt numbers 20h to 3Fh for its own use.  This
  173. means absolute memory locations 80h to 0FFh are reserved by DOS.
  174.  
  175.  
  176.  
  177. Interrupt 20h - Terminate Current Program ....................... 4**5
  178.  
  179. (0:0080h)
  180.   Issue int 20h to exit from a program.  This vector transfers to the
  181. logic in DOS to restore the terminate address, the Ctrl-Break address,
  182. and the critical error exit address to the values they had on entry to
  183. the program.  All the file buffers are flushed and all handles are
  184. closed.  You should close all files changed in length (see function
  185. calls 10h and 3Eh) before issuing this interrupt.  If the changed file
  186. is not closed, its length, time, and date are not recorded correctly
  187. in the directory.
  188.  
  189.   This call is intended for use with .COM programs only.
  190.  
  191.   For a program to pass a completion code or an error code when
  192. terminating, it must use either function call 4Ch (Terminate a
  193. Process) or 31h (Terminate Process and Stay Resident).  These two
  194. methods are preferred over using int 20h and the codes returned by
  195. them can be interrogated in batch processing.
  196.  
  197. Important: Before you issue an interrupt 20h, your program must
  198.            ensure that the CS register contains the segment of its
  199.            Program Segment Prefix.
  200.  
  201. Interrupt 20h   DOS - Terminate Program
  202. entry   no parameters
  203. return  The following vectors are restored from the Program Segment
  204.         Prefix:
  205.         PSP offset  interrupt  description
  206.             0Ah        22h     Program Terminate
  207.             0Eh        23h     Control-C
  208.             12h        24h     Critical Error
  209. note 1) IBM and Microsoft recommend using int 21h Fn 4Ch.  Using int
  210.         20h is officially frowned upon since the introduction of DOS
  211.         2.0.
  212.      2) In DOS 3.2 at least, int 20h merely calls int 21h, fn 00h.
  213.      3) Supported by PC-MOS/386.
  214.  
  215.  
  216.  
  217. DOS Services (quick list) ....................................... 4**6
  218.  
  219. ┌────────────────────────────────────────────────────────────────────┐
  220. │Interrupt 21h  Function Call Request                                │
  221. └────────────────────────────────────────────────────────────────────┘
  222. (0:0084h)
  223.   DOS provides a wide variety of function calls for character device 
  224. I/O, file management, memory management, date and time functions,
  225. execution of other programs, and more.  They are grouped as follows: 
  226.  
  227.           call              description
  228.         00h           program terminate
  229.         01h-0Ch       character device I/O, CP/M compatibility format
  230.         0Dh-24h       file management,      CP/M compatibility format
  231.         25h-26h       nondevice functions,  CP/M compatibility format
  232.         27h-29h       file management,      CP/M compatibility format
  233.         2Ah-2Eh       nondevice functions,  CP/M compatibility format
  234.         2Fh-38h       extended functions
  235.         39h-3Bh       directory group
  236.         3Ch-46h       extended file management
  237.         47h           directory group
  238.         48h-4Bh       extended memory management
  239.         54h-57h       extended functions
  240.         5Eh-5Fh       networking
  241.         60h-62h       extended functions
  242.         63h-66h       enhanced foreign language support
  243.  
  244.  
  245. List of DOS services:   * = undocumented
  246.         00h     terminate program
  247.         01h     get keyboard input
  248.         02h     display character to STDIO
  249.         03h     get character from STDAUX
  250.         04h     output character to STDAUX
  251.         05h     output character to STDPRN
  252.         06h     direct console I/O - keyboard to screen
  253.         07h     get char from std I/O without echo
  254.         08h     get char from std I/O without echo, checks for ^C
  255.         09h     display a string to STDOUT
  256.         0Ah     buffered keyboard input
  257.         0Bh     check STDIN status
  258.         0Ch     clear keyboard buffer and invoke keyboard function
  259.     o   0Dh     flush all disk buffers
  260.     o   0Eh     select disk
  261.         0Fh     open file with File Control Block
  262.         10h     close file opened with File Control Block
  263.         11h     search for first matching file entry
  264.         12h     search for next matching file entry
  265.         13h     delete file specified by File Control Block
  266.         14h     sequential read from file specified by File Control
  267.                 Block
  268.         15h     sequential write to file specified by File Control
  269.                 Block
  270.         16h     find or create firectory entry for file
  271.         17h     rename file specified by file control block
  272.         18h*    unknown
  273.     o   19h     return current disk drive
  274.     o   1Ah     set disk transfer area (DTA)
  275.         1Bh     get current disk drive FAT
  276.         1Ch     get disk FAT for any drive
  277.         1Dh*    unknown
  278.         1Eh*    unknown
  279.         1Fh     read DOS disk block, default drive
  280.         20h*    unknown
  281.         21h     random read from file specified by FCB
  282.         22h     random write to file specified by FCB
  283.         23h     return number of records in file specified by FCB
  284.         24h     set relative file record size field for file specified
  285.                 by FCB
  286.     o   25h     set interrupt vector
  287.         26h     create new Program Segment Prefix (PSP)
  288.         27h     random file block read from file specified by FCB
  289.         28h     random file block write to file specified by FCB
  290.         29h     parse the command line for file name
  291.     o   2Ah     get the system date
  292.     o   2Bh     set the system date
  293.     o   2Ch     get the system time
  294.     o   2Dh     set the system time
  295.     o   2Eh     set/clear disk write VERIFY
  296.     o   2Fh     get the Disk Transfer Address (DTA)
  297.     o   30h     get DOS version number
  298.         31h     TSR, files opened remain open
  299.         32h     read DOS Disk Block
  300.     o   33h     get or set Ctrl-Break
  301.         34h     INDOS  Critical Section Flag
  302.     o   35h     get segment and offset address for an interrupt
  303.     o   36h     get free disk space
  304.         37h*    get/set option marking character (SWITCHAR)
  305.     o   38h     return country-dependent information
  306.     o   39h     create subdirectory
  307.     o   3Ah     remove subdirectory
  308.     o   3Bh     change current directory
  309.     o   3Ch     create and return file handle
  310.     o   3Dh     open file and return file handle
  311.     o   3Eh     close file referenced by file handle
  312.     o   3Fh     read from file referenced by file handle
  313.     o   40h     write to file referenced by file handle
  314.     o   41h     delete file
  315.     o   42h     move file pointer (move read-write pointer for file)
  316.     o   43h     set/return file attributes
  317.     o   44h     device IOCTL (I/O control) info
  318.     o   45h     duplicate file handle
  319.     o   46h     force a duplicate file handle
  320.     o   47h     get current directory
  321.     o   48h     allocate memory
  322.     o   49h     release allocated memory
  323.     o   4Ah     modify allocated memory
  324.     o   4Bh     load or execute a program
  325.     o   4Ch     terminate prog and return to DOS
  326.     o   4Dh     get return code of subprocess created by 4Bh
  327.     o   4Eh     find first matching file
  328.     o   4Fh     find next matching file
  329.         50h*    set new current Program Segment Prefix (PSP)
  330.         51h*    puts current PSP into BX
  331.         52h*    pointer to the DOS list of lists
  332.         53h*    translates BPB (Bios Parameter Block, see below)
  333.     o   54h     get disk verification status (VERIFY)
  334.         55h*    create PSP: similar to function 26h
  335.     o   56h     rename a file
  336.     o   57h     get/set file date and time
  337.         58h     get/set allocation strategy             (DOS 3.x)
  338.     o   59h     get extended error information
  339.     o   5Ah     create a unique filename
  340.     o   5Bh     create a DOS file
  341.     o   5Ch     lock/unlock file contents
  342.         5Dh     DOS internal functions
  343.         5Eh*    network printer
  344.         5Fh*    network redirection
  345.         60h*    parse pathname (TRUENAME)
  346.         61h*    unknown
  347.         62h     get program segment prefix (PSP)
  348.         63h*    get lead byte table                     (DOS 2.25)
  349.         64h*    unknown
  350.         65h     get extended country information        (DOS 3.3)
  351.         66h     get/set global code page table          (DOS 3.3)
  352.         67h     set handle count                        (DOS 3.3)
  353.         68h     commit file                             (DOS 3.3)
  354.         69h     disk serial number                      (DOS 4.0)
  355.         6Ah     unknown
  356.         6Bh     unknown
  357.         6Ch     extended open/create                    (DOS 4.0)
  358.  
  359.   Items marked with 'o' are explicitly supported in the OS/2 1.x DOS
  360. Compatibility Box, according to Microsoft.  Most everything is 
  361. supported in the OS/2 2.0 Virtual DOS Machine, according to IBM.
  362.  
  363.  
  364. Calling the DOS Services ........................................ 4**7
  365.  
  366.   The DOS services are invoked by placing the number of the desired
  367. function in register AH, subfunction in AL, setting the other
  368. registers to any specific requirements of the function, and invoking
  369. int 21h.
  370.  
  371.   When the interrupt is called, all register and flag values are 
  372. pushed into the stack.  Int 21h contains a pointer into an absolute 
  373. address in the IBMDOS.COM file.  This address is the main loop for the 
  374. DOS command handler.  The handler pops the register values, compares 
  375. them to its list of functions, and executes the function if valid.  
  376. When the function is complete, it may pass values back to the command 
  377. handler. The handler will push the values into the stack and then 
  378. return control to the calling program. 
  379.  
  380.   Most functions will return an error code; some return more
  381. information.  Details are contained in the listings for the individual
  382. functions.  Extended error return codes for most functions may be
  383. obtained by calling function 59h.
  384.  
  385.   Register settings listed are the ones used by DOS.  Some functions
  386. will return with garbage values in unused registers.  Do not test for
  387. values in unspecified registers; your program may exhibit odd behavior.
  388.  
  389.   DS:DX pointers are the data segment register (DS) indexed to the DH
  390. and DL registers (DX).  DX always contains the offset address, DS
  391. contains the segment address.
  392.  
  393.   The File Control Block services (FCB services) were part of DOS 1.0.
  394. Since the release of DOS 2.0, Microsoft has recommended that these
  395. services not be used.  A set of considerably more enhanced services
  396. (handle services) were introduced with DOS 2.0.  The handle services
  397. provide support for wildcards and subdirectories, and enhanced error
  398. detection via function 59h.  The FCB calls  also do not support the
  399. sharing modes or file locking functions of the handle calls, making
  400. them unsafe for use with networks or multitaskers.
  401.  
  402.   The data for the following calls was compiled from various Intel,
  403. Microsoft, IBM, and other publications.  There are many subtle
  404. differences between MSDOS and PCDOS and between the individual
  405. versions.  Differences between the versions are noted as they occur.
  406.  
  407.   There are various ways of calling the DOS functions.  For all
  408. methods, the function number is loaded into register AH, subfunctions
  409. and/or parameters are loaded into AL or other registers, and call int
  410. 21h by one of the following methods:
  411.  
  412.  A) call interrupt 21h directly  (the recommended procedure)
  413.  B) perform a long call to offset 50h in the program's PSP.
  414.      1) This method will not work under DOS 1.x.
  415.      2) Though recommended by Microsoft for DOS 2.0, this method takes
  416.         more time and is no longer recommended.
  417.  C) place the function number in CL and perform an intrasegment call
  418.     to location 05h in the current code segment.  This location
  419.     contains a long call to the DOS function dispatcher.
  420.      1) IBM recommends this method be used only when using existing
  421.         programs written for different calling conventions.  (such as
  422.         converting CP/M programs).  This method should be avoided
  423.         unless you have some specific use for it.
  424.      2) AX is always destroyed by this method.
  425.      3) This method is valid only for functions 00h-24h.
  426.  D) PC-MOS/386' virtualization scheme results in 200-400+ clocks per
  427.     interrupt when run on an 80286 machine since it has to flip in and
  428.     out of protected mode at CPU ring 0.  TSL recommends the following
  429.     procedure for apps that must run quickly on 286 machines:
  430.        1) PUSHF
  431.        2) CLI
  432.        3) CALL DWORD PTR[vector-contents]
  433.     This avoids flipping in and out of protected mode and the attendant
  434.     overhead.  However, TSL specifies this technique should not be used
  435.     with native-mode MOS applications.
  436.  
  437.  
  438.   There are also various ways of exiting from a program. (assuming it
  439. is not intended to be a TSR).  All methods except call 4Ch must ensure
  440. that the segment register contains the segment address of the PSP.
  441.  
  442.  A) Interrupt 21h, function 4Ch (Terminate with Result Code). This is
  443.     the "official" recommended method of returning to DOS.
  444.  B) Interrupt 21h, function 00h (Exit Program).  This is the early
  445.     style int 21h function call.  It simply calls int 20h.
  446.  C) Interrupt 20h (Exit).
  447.  D) A JMP instruction to offset 00h (int 20h vector) in the Program
  448.     Segment Prefix.  This is just a roundabout method to call int 20h.
  449.     This method was set up in DOS 1.0 for ease of conversion for CP/M
  450.     programs.  It is no longer recommended for use.
  451.  E) A JMP instruction to offset 05h (int 21 vector) in the Program
  452.     Segment Prefix, with AH set to 00h or 4Ch.  This is another CP/M
  453.     type function.
  454.  
  455.  
  456.  
  457. Version Specific Information .................................... 4**8
  458.  
  459. * Function Calls:
  460.  
  461.         DOS 2.x  supports function calls 00h to 57h.
  462.                 
  463.         DOS 2.25 is the only version to support function 63h
  464.                  (foreign keyboard)
  465.  
  466.         DOS 3.x  has more sophisticated error handling and detection
  467.                  function calls available than 2.x.
  468.  
  469.         DOS 3.0  supports function calls 00h to 5Ch and 62h, including
  470.                  new and changed function calls for version 3.0:
  471.                    3Dh  Open File
  472.                    59h  Get Extended Error
  473.                    5Ah  Create Temporary File
  474.                    5Bh  Create New File
  475.                    5Ch  Lock/Unlock File Access
  476.                    62h  Get Program Segment Prefix Address
  477.  
  478.         DOS 3.1  supports function calls 00h to 62h, including the
  479.                  new  and changed function calls for DOS 3.1:
  480.                    5E00h  Get Machine Name
  481.                    5E02h  Set Printer Setup
  482.                    5E03h  Get Printer Setup
  483.                    5F02h  Get Redirection List Entry
  484.                    5F03h  Redirect Device
  485.                    5F04h  Cancel Redirection
  486.  
  487.         DOS 3.2  supports the following new functions:
  488.                    44h    extended IOCTL functions
  489.  
  490.         DOS 3.3  supports the following new functions:
  491.                    44h    extended IOCTL functions
  492.                    65h    get extended country information (DOS 3.3)
  493.                    66h    get/set global code page table (DOS 3.3)
  494.                    67h    set handle count (DOS 3.3)
  495.                    68h    commit file (DOS 3.3)
  496.  
  497.         DOS 4.0  supports the following new functions:
  498.                    44h    extended IOCTL functions
  499.                    69h    disk serial number
  500.                    6Ch    extended open/create
  501.  
  502.         DOS 5.0  supports the following new int 21h functions:
  503.                    30h     sub 00h Get OEM ID number
  504.                            sub 01h Get version flag
  505.                    33h     sub 06h Return "real" DOS version number
  506.                    44h     sub 0Dh/68h, Sense Media Type
  507.                            sub 10h Query IOCTL handle
  508.                            sub 11h Query IOCTL device
  509.                    4Bh     sub 01h load but don't execute
  510.                                    (formerly undocumented)
  511.                            sub 05h  Enter EXEC State
  512.                    51h     Get Program Segment Prefix
  513.                                    (formerly undocumented)
  514.                    58h     sub 02h Get UMB Link Status
  515.                            sub 03h Set UMB Link Status
  516.                    65h     Get Extended Country Information
  517.                            sub 05h  Get filename character table
  518.                            sub 20h  Convert character
  519.                            sub 21h  Convert string
  520.                            sub 22h  Convert ASCIIZ string
  521.  
  522.                 ...and the following other functions:
  523.                    2Fh     sub 1680h MS-DOS Idle Call
  524.                    Task Switcher API
  525.  
  526.         DOS 6.0  supports the following new int 21h functions:
  527.                    44h     sub 04h adds DoubleSpace flush
  528.  
  529.  
  530. PCjr Cartridge Support .......................................... 4**9
  531.  
  532. ==========================
  533. ibm.dos/secrets.2 #1337, from jswitzer, 525 chars, Sat Jul 29 08:48:15 1989
  534. This is a comment to message 1334.
  535. --------------------------
  536. The PCJr ROM cartridges have a command table that lists the name of
  537. each supported command and its vector in the ROM.  It does the ROM
  538. match first before the internal command match, actually, so it will
  539. execute what it finds there.  Now that I think about it, this means that
  540. you could burn your own ROMs in the proper format and get your own
  541. commands. Neat, I guess.
  542.  
  543. As to it being in command.com, my DOS 3.3 version has some of the code
  544. about 1A4C.  Do a search with debug for "55 AA" and you'll find the
  545. main routine.
  546.  
  547. Read:comment
  548. Comment to message number 1337. Enter text. End with '.<CR>'
  549. > 55 AA, that's right. That's the ID for a valid ROM. I'll fire up
  550. > symdeb and poke through COMMAND if I can find my little white cane...
  551.  
  552.  
  553. ==========================
  554. ibm.dos/secrets.2 #1776, from jswitzer, 319 chars, Tue Sep 19 01:33:09 1989
  555. This is a comment to message 1773.
  556. --------------------------
  557. Actually, you can NOP all of the PCJr code without problems -- AST and
  558. Toshiba both have COMMAND.COM without it, and no major problems.  The
  559. interesting thing is that PC-DOS 4.0x still has it, and they explicity
  560. say that DOS 4 is NOT supported on the PCJr (*they* meaning IBM, of
  561. course).
  562.  
  563. What can you figure, huh?
  564.  
  565. Read:comment
  566. Comment to message number 1776. Enter text. End with '.<CR>'
  567. > I sold my PCjr this morning (I swear to Baud!) and therefore can't make
  568. >a test to see what would happen with 4.0 on the Jr. If IBM still sells
  569. >the PC/JX in Japan that might be the reason for continuing cartridge
  570. >support, since the machine is PCjr-based (well, about the way a PS/2 is
  571. >PC-based).
  572. > I used to run Toshiba DOS 2.11V on the Jr since it was provably faster
  573. >on screen updates and disk access than IBM 2.1 (with a Jr, it doesn't take
  574. >much to make a noticable difference). The only cartridges I had were
  575. >ColorPaint and BASIC, and I can't remember if I used 2.11 with them or
  576. >not.
  577. >
  578. ==========================
  579. ibm.dos/secrets.2 #1777, from jswitzer, 251 chars, Tue Sep 19 01:34:24 1989
  580. --------------------------
  581. The PCJr code in COMMAND.COM is ONLY executed on the PCJr and the PCJr
  582. doesn't support normal BIOS expansion ROMs, only the expansion cartridges.
  583.  
  584. So, no conflict.  If you patch out the check for the PCJr machine ID,
  585. though, good luck!
  586.         John Switzer
  587. Read:comment
  588. Comment to message number 1777. Enter text. End with '.<CR>'
  589. > Ummm..... lemme go back and look at the listing again. The way it looked
  590. >the first time, it seemed like ALL commands went through the loop.
  591.  
  592.  
  593. Compatibility Problems With DOS 4.0 ............................. 4**10
  594.  
  595.   Compatibility problems with DOS 4.00 lie mainly in int 2Ah and int 
  596. 2Fh.  While 2Ah was always reserved, some network software uses this 
  597. interrupt.  IBM and Microsoft documentation prior to 4.0 strongly 
  598. implies that int 2Fh functions not already used by PRINT.COM were open 
  599. for general use.  DOS 4.00 grabs a number of these functions. The 
  600. difference in disk handling when >32mb partitions are used causes 
  601. problems with some older software. 
  602.  
  603.   Most DOS 4.00 external programs (ASSIGN, SUBST, etc) check for files 
  604. being printed - including LABEL.  This is part of the enhanced network 
  605. support.  Almost all DOS 4.00 externals make checks for NETBIOS too. 
  606.  
  607.   DOS 5.0 ditched most of this peculiar stuff, making for a much more 
  608. stable product.
  609.  
  610.  
  611.  
  612. eDOS 4.0 ........................................................ 4**11
  613.  
  614.   Microsoft had announced their intent to build a multitasking, 
  615. multiuser version of MSDOS as early as 1982.   As mentioned in Chapter 
  616. 1, the DOS 4.0 issued to selected OEMS in England and Europe in 
  617. '86/'87 is not the same code that was released here as DOS 4.0 in 
  618. 1988.  Microsoft shipped betas of "DOS 4.0" in the US during the same 
  619. time period, but the product was never release in the US.  The 
  620. European DOS 4.0 (eDOS?) is a multitasking DOS written by Microsoft, 
  621. while the US DOS 4.0 is a single tasking DOS written by IBM.  eDOS 4.0 
  622. was released in Europe after 3.1, but before 3.2. 
  623.  
  624. (abstracted from a pre-release document):
  625.  
  626.   `Microsoft Multitasking MS-DOS Product Specification'  dated April
  627. 28, 1986
  628.  
  629.   MS-DOS 4.0 is a multitasking operating system, developed from and 
  630. compatible with MS-DOS 3.1.  It supports true multitasking which gives 
  631. the user the illusion of and benefits from many independent computers.  
  632. Further, MS-DOS 4.0 allows most existing MS-DOS 2.x and 3.x 
  633. applications to run without change in the MS-DOS 4.0 multitasking 
  634. environment. 
  635.  
  636. (end of abstract).
  637.  
  638.   Gordon Letwin of Microsoft had this to say about eDOS:
  639.  
  640. (excerpted from "Turning Off The Car To Change Gears" Microsoft Systems
  641.  Journal, volume 2, number 2. May 1987)
  642.  
  643.   "DOS 4 was the first product to result from Microsoft's multitasking 
  644. DOS effort.  We began it even before IBM introduced the PC AT.  It was 
  645. an ambitious project that was originally to include a protected mode 
  646. with mode switching capabilities so it could run on the 8086 or the 
  647. 286. 
  648.   A general-purpose multitasking system needs to run in both modes: 
  649. the unprotected 8086 mode so that we can run existing DOS 
  650. applications, and the protected 286 mode so that we can multitask 
  651. arbitrary, unrelated applications. But the architecture of the 286 
  652. caused some delays.  Although we knew the project would be difficult, 
  653. it was only after we'd gotten deeply into it that we realized just how 
  654. difficult it would be. 
  655.   As a result, DOS 4 became too complicated for our schedules.  
  656. Because of the pressure of customer demand as well as that of previous 
  657. commitments, we broke the project into two parts.  DOS 4 runs only in 
  658. real mode and provides multitasking only for specialized applications.  
  659. DOS 5, which has now been released as OS/2, includes the protected 
  660. mode and other features.  DOS 4 was delivered in the last half of 1986 
  661. and is being sold in special application environments, primarily in 
  662. Europe.  It is a specialized product that can share the market with 
  663. OS/2, because it runs on 8086 hardware, while OS/2 requires a 286.  
  664. The move from DOS 4 to OS/2 was a gradual evolutionary process." 
  665.  
  666. (end of excerpt)
  667.  
  668.   eDOS 4.0 consisted of one main program (DOS2/3 compatible) and 
  669. several multitasking (background) programs that had to be written 
  670. specially.  The whole lot was constrained to fit in the single 640k 
  671. memory map. 
  672.  
  673. int 21h functions:   (some of these appeared in later versions of DOS)
  674.  
  675. AEXEC       Identical to EXEC sub 4.
  676. CREATMEM    creates a named area of memory which may be accessed by
  677.             other processes.  (shared memory \SHAREMEM\...)
  678. CRITENTER, CRITLEAVE (semaphore routines)
  679. CRITERR     (This is the one that should have been in DOS 3)
  680.             Enables hard error processing or automatically fails hard
  681.             errors.
  682. CWAIT       Waits for return code from asynchronous process.  Returns
  683.             when any child process terminates.  Children may also be
  684.             started as orphans in which case you cannot WAIT for them.
  685. EXEC 4Bh    (sub function 4) - Start async process.
  686. FREEZE      Stops a specified process running.
  687. GETEXTENDEDERROR - As for DOS3 except it checks version number to
  688.             specify the level of error handling - you may ask for a
  689.             pointer to the hard error information packet for the latest
  690.             hard error.
  691. GETMEM      obtains access to a shared memory area previously created.
  692. GETPID      Returns process ID and parents process ID.
  693. GET/SET MEMORY PARTITION SIZE
  694.             foreground memory is used for ordinary apps.  Background
  695.             memory is used for DOS 4 apps that don't use the screen (or
  696.             only use it through popup functions).  Background apps can
  697.             also use foreground memory but not vice versa.
  698. KILL        Terminates a process.
  699. PBLOCK      Block a process until matching PRUN is given.  A timeout
  700.             is also specified.  A memory location is passed which must
  701.             be matched in the PRUN.  (semaphore)
  702. PIPE        Create a pipe.  Access it through READ/WRITE/CLOSE (but not
  703.             LSEEK).
  704. PRUN        Release a blocked process.  (semaphore)
  705. RELEASEMEM  Release access to shared memory.  If the reference count
  706.             hits zero then the memory is freed.
  707. RESUME      Thaws a frozen process.
  708. SEND SIGNAL
  709.             Signals were:
  710.                   SIGINTR, SIGTERM, SIGPIPE, SIGUSER1, SIGUSER2.
  711.                   Control C, End of program, Broken pipe, user def,
  712.                   user def.
  713.             Actions were:
  714.                   Terminate process on receipt, ignore, accept,
  715.                   sender gets error or acknowledge received signal.
  716.            The last one of these returns to the sender immediately -
  717.            it is intended for use when processing the signal will take
  718.            a long time.
  719. SETFILETABLE (86h)   Install a new file handle table. (more than 20
  720.            files, as in DOS 3.3+?)
  721. SETPRI      Sets process priority (for this process or entire subtree).
  722. SET SIGNAL HANDLER
  723. SLEEP       Suspends the current process for given number of
  724.             milliseconds.  MSC 4.0 had a demo which called 'DOS_sleep'
  725.             int 21h/fn 89h - does not appear to be implemented in
  726.             known DOS versions.
  727. WAIT        As for DOS 3.
  728.  
  729. int 2Fh functions:
  730.  
  731. CHECKPU    check for popup package installation
  732. POSTPU     open/close a popup screen
  733. SAVEPU     save popup screen
  734. RESTOREPU  restore popup screen
  735.  
  736. Other useful features:
  737.  
  738.    eDOS 4.0 programs used the Windows .EXE format
  739.    programs may share code segments
  740.    improved device drivers
  741.        the serial port had a full set of IOCTL calls (used through
  742.           a new generic IOCTL call).
  743.        device drivers could be multi-tasking.  They had appropriate
  744.           support routines to queue multiple requests (just like OS/2
  745.           later provided)
  746.    interrupt driven serial ports
  747.    sorted disk buffers before writing
  748.  
  749.  
  750. The following were listed as possible future enhancements:
  751.  
  752.    File system protection and        (not yet available from MS,
  753.      permissions                      though DRI has it)
  754.  
  755.    High performance file system      (HPFS was delivered in OS/2 1.2)
  756.  
  757.    Installable file systems          (IFS hook is present in US DOS 
  758.                                       4.0, deleted in DOS 5 according
  759.                                       to Gordon Letwin of Microsoft)
  760.  
  761.    Symbolic links                    (they don't have these on OS/2
  762.                                       even now do they?)
  763.  
  764.    Undelete                          (added with DOS 5.0)
  765.  
  766.    Long names, lowercase names,      (OS/2 HPFS, NT NTFS)
  767.    access/creation date/time, name
  768.    of app creating file, revision
  769.    number etc.
  770.  
  771.  
  772.   According to bits of information picked up from BIX, Wang tested an 
  773. alpha version of eDOS 4.0 for use on a laptop project sometime in 1985 
  774. but gave up because the OS was unable to cope with "ill behaved" 
  775. programs in a reasonable fashion.  I talked with one person who had 
  776. beta-tested it for MS, who commented "the only thing it would run was 
  777. COMMAND.COM."  Microsoft has evidently either squashed eDOS completely 
  778. or (likely) incorporated it into OS/2.  I've been unable to determine 
  779. if the French post office still uses eDOS, and to the best I can find 
  780. out Apricot Computer never did much with it. 
  781.  
  782.   DOSREF user John Dallman contributed the following:  (July 1992)
  783.  
  784.   "You put a few notes in DOSREF about the multi-tasking MS-DOS 4.0 
  785. that was released in Europe during 1986/87.  Notably, you wondered if 
  786. it ever reached any customers.  I'm sorry to tell you that the answer 
  787. is yes - briefly.  It was withdrawn owing to serious reliability 
  788. problems: Apricot and ICL sold it in the UK, and I've had email from 
  789. someone who bought a retail copy in Hong Kong." 
  790.  
  791.   Ray Duncan had this to say about eDOS' metamorphosis: (PC Magazine, 
  792. October 16, 1990 excerpted from Power Programming, page 464) 
  793.  
  794.   "OS/2 as it exists today is a vastly different system than the 
  795. protected-mode successor to DOS first envisioned by Microsoft in 1984 
  796. and 1985.  The earliest version, internally known as DOS 5.0 or 
  797. 286DOS, was small and relatively fast - it could even be booted from a 
  798. floppy disk on a 1mb 80286 machine.  The 286DOS application program 
  799. interface (API), which was a proper superset of the DOS Int 21h, 
  800. Microsoft Mouse Int 33h, and ROM BIOS video Int 10h and keyboard Int 
  801. 16h interfaces, was small enough to be easily understood and allowed 
  802. the straightforward porting of any DOS application.  286DOS was not 
  803. burdened with a built-in graphical user interface; the original plan 
  804. was to make a protected-mode version of Microsoft Windows available as 
  805. a separate product that the user could run on top of 286DOS as an 
  806. option. 
  807.  But somewhere along the torturous path from the original, 
  808. experimental implementations of 286DOS to the retail product now known 
  809. as OS/2, things went badly awry..." 
  810.  
  811.   Microsoft Press' "MSDOS Encyclopedia" shows a reproduction of a late 
  812. DOS 1.25 OEM brochure.  Microsoft was touting future enhancements to 
  813. 1.25 including Xenix-compatible pipes, process forks, and 
  814. multitasking, as well as "graphics and cursor positioning, kanji 
  815. support, multi-user and hard disk support, and networking."  Microsoft 
  816. certainly thought big, but, alas, the forks, multitasking, and 
  817. multiuser support never came about, at least in US versions of DOS.  
  818. Oddly, the flyer claims that... 
  819.  
  820.  "MS-DOS has no practical limit on disk size.  MS-DOS uses 4-byte 
  821. XENIX OS compatible pointers for file and disk capacity up to 4 
  822. gigabytes." 
  823.  
  824.   Umm... yeah.  One sort of gets the idea nobody at Microsoft had a 
  825. hard disk larger than 32 megabytes... 
  826.  
  827.  For the record they actually delivered:
  828.                                 
  829. Xenix-compatible pipes             DOS 2.0  ("|" operator)
  830. process forks, and multitasking   eDOS 4.0  (not delivered in the US)
  831. multi-user                         never delivered
  832. graphics and cursor positioning    DOS 2.0  (ANSI.SYS, more than likely)
  833. kanji support                      DOS 2.01, 2.25 (double-byte char set)
  834. hard disk support                  DOS 2.0  (subdirectories)
  835. networking                         DOS 3.1  (file locking, MS Networks)
  836.  
  837.   Early Microsoft ads pumped DOS' Xenix-like features and promised 
  838. Xenix functionality in future releases. 
  839.  
  840.   We'll probably never know what the real story was behind eDOS - DOS 
  841. 4 - DOS 5 - 286DOS - OS/2.  Despite Gordon Letwin's acid comments 
  842. about problems with the 80286 processor, I doubt the '286 was the 
  843. barrier between users and a multitasking MSDOS.  I also doubt there 
  844. was any shortage of programming talent at Microsoft - Digital 
  845. Research's Concurrent DOS and Software Link's PC-MOS were developed 
  846. without undue trouble. 
  847.  
  848.   Though it's highly unlikely anyone would ever need programming 
  849. information for eDOS, I find the entire subject fascinating.  IBM had 
  850. not only promised the product, they ran ads for it in 1984-85. Who 
  851. axed the project?  Why?  We'll likely never find out. 
  852.  
  853.  
  854.  
  855. DOS Services in Detail .......................................... 4**12
  856.  
  857.  
  858. INT 21H   DOS services
  859.           Function (hex)
  860.  
  861. * Indicates Functions not documented in the IBM DOS Technical
  862. Reference.
  863.  
  864.   Note some functions have been documented in other Microsoft or
  865. licensed OEM documentation.
  866.  
  867.  
  868. Function  00h   Terminate Program
  869.       Ends program, updates, FAT, flushes buffers, restores registers
  870. entry   AH      00h
  871.         CS      segment address of PSP
  872. return  none
  873. note 1) Program must place the segment address of the PSP control
  874.         block in CS before calling this function.
  875.      2) The terminate, ctrl-break,and critical error exit addresses
  876.         (0Ah, 0Eh, 12h) are restored to the values they had on entry
  877.         to the terminating program, from the values saved in the
  878.         program segment prefix at locations PSP:000Ah, PSP:000Eh, and
  879.         PSP:0012h.
  880.      3) All file buffers are flushed and the handles opened by the
  881.         process are closed.
  882.      4) Any files that have changed in length and are not closed are
  883.         not recorded properly in the directory.
  884.      5) Control transfers to the terminate address.
  885.      6) This call performs exactly the same function as int 20h.
  886.      7) All memory used by the program is returned to DOS.  DOS just
  887.         goes up the chain of memory blocks and marks any that are
  888.         owned by the PSP which is terminating as free.
  889.      8) TOS: $00 TERM.  Returns system control to the program from
  890.         which it started.  If EXECed from a program, returns to that
  891.         program.  If started from DeskTop, returns to DeskTop.  This
  892.         is important for chaining program segments.
  893.      9) Files opened with FCBs are not automatically closed.
  894.     10) Supported in PC-MOS/386 compatibility mode, but not available
  895.         for native MOS 386-mode applications.
  896.  
  897.  
  898. Function  01h     Get Keyboard Input
  899.         Waits for char at STDIN (if necessary), echoes to STDOUT
  900. entry   AH      01h
  901. return  AL      ASCII character from STDIN (8 bits)
  902. note 1) Checks char for Ctrl-C, if char is Ctrl-C, executes int 23h.
  903.      2) For function call 06h, extended ASCII codes require two
  904.         function calls.  The first call returns 00h as an indicator
  905.         that the next call will be an extended ASCII code.
  906.      3) Input and output are redirectable.  If redirected, there is
  907.         no way to detect EOF.
  908.      4) TOS: $1 CONIN.  Char returns in D0. ASCII code of char in
  909.         high byte, keyboard scan code in low byte.  Will return
  910.         scancode on keys which have no ASCII value.
  911.  
  912.  
  913. Function  02h   Display Output
  914.       Outputs char in DL to STDOUT
  915. entry   AH      02h
  916.         DL      8 bit data (usually ASCII character)
  917. return  none
  918. note 1) If char is 08 (backspace) the cursor is moved 1 char to the
  919.         left (nondestructive backspace).
  920.      2) If Ctrl-C is detected after input, int 23h is executed.
  921.      3) Input and output are redirectable.  If redirected, there is no
  922.         way to detect disk full.
  923.      4) TOS: $2 CONOUT.  Char must be placed on the stack as the first
  924.         word.  The ASCII value of the char goes in the low byte and
  925.         the high byte is zero.  Chars are output to DEVICE #2, normal
  926.         console output.  Control characters and escape sequences are
  927.         interpreted normally.
  928.      5) Under DOS 1.x, 02h sends a character to the active display.
  929.         Under DOS 2.x and later, the char goes to STDOUT.
  930.  
  931.  
  932. Function  03h   Auxiliary Input
  933.       Get (or wait until) character from STDAUX
  934. entry   AH      03h
  935. return  AL      ASCII char from auxiliary device
  936. note 1) AUX, COM1, COM2 is unbuffered and not interrupt driven.
  937.      2) This function call does not return status or error codes.
  938.         For greater control it is recommended that you use the ROM BIOS
  939.         routines (int 14h) or write an AUX device driver and use IOCTL.
  940.      3) At startup, PC-DOS initializes the first auxiliary port (COM1)
  941.         to 2400 baud, no parity, one stop bit, and an 8-bit word.
  942.         Versions of MSDOS may differ.
  943.      4) If Ctrl-C is has been entered from STDIN, int 23h is executed.
  944.      5) TOS: $03 AUXILIARY INPUT.  Function returns when the character
  945.         has been received.  Char is returned in the low byte of D0.
  946.      6) Under DOS 1.x, the character is read from COM1.  Under DOS
  947.         2.x and later, it is read from STDAUX.
  948.  
  949.  
  950. Function  04h   Auxiliary Output
  951.       Write character to STDAUX
  952. entry   AH      04h
  953.         DL      ASCII char to send to AUX
  954. return  none
  955. note 1) This function call does not return status or error codes.
  956.         For greater control it is recommended that you use the ROM
  957.         BIOS routine (int 14h) or write an AUX device driver and use
  958.         IOCTL.
  959.      2) If Ctrl-C is has been entered from STDIN, int 23h is executed.
  960.      3) Default is COM1 unless redirected by DOS.
  961.      4) If the device is busy, this function will wait until it is
  962.         ready.
  963.      5) TOS: $04 AUXILIARY OUTPUT.  High byte should be zero, low byte
  964.         is ASCII code.
  965.      6) Under DOS 1.x, the character is sent to COM1.  Under DOS 2.x
  966.         and later, it goes to STDAUX.
  967.  
  968.  
  969. Function  05h   Printer Output
  970.       Write character to STDPRN
  971. entry   AL      05h
  972.         DL      ASCII code for character to send
  973. return  none
  974. note 1) If Ctrl-C is has been entered from STDIN, int 23h is executed.
  975.      2) Default is PRN or LPT1 unless redirected with the MODE command.
  976.      3) If the printer is busy, this function will wait until it is
  977.         ready.
  978.      5) TOS: $05 PRINTER OUTPUT.  High byte of D0 is zero, low byte is
  979.         character.  Returns -1 if character is sent successfully.
  980.         Times out after 30 seconds and resets D0 to zero.
  981.      6) Under DOS 1.x, this function writes to LPT1.  Under DOS 2.x
  982.         and higher it writes to STDPRN.
  983.  
  984.  
  985. Function  06h   Direct Console I/O
  986.       Get character from STDIN; echo character to STDOUT
  987. entry   AH      06h
  988.         DL      0FFh for console input, or 00h-0FEh for console output
  989. return  ZF      set     no character available
  990.                 clear   character recieved
  991.         AL      ASCII code for character
  992. note 1) Extended ASCII codes require two function calls.  The first
  993.         call returns 00h to indicate the next call will return an
  994.         extended code.
  995.      2) If DL is not 0FFh, DL is assumed to have a valid character
  996.         that is output to STDOUT.
  997.      3) This function does not check for Ctrl-C or Ctrl-PrtSc.
  998.      4) Does not echo input to screen.
  999.      5) If I/O is redirected, EOF or disk full cannot be detected.
  1000.      6) TOS: $06 RAWCONIO.  Get character from keyboard by calling
  1001.         with $FF in D0.  ASCII and scan codes are returned as per
  1002.         CONIN.  If a value other than $FF is used, it is printed to
  1003.         STDOUT at the current cursor position.  This call interprets
  1004.         all control chars and escape sequences.
  1005.      7) Under DOS 1.x, this call handles the keyboard and display
  1006.         directly.  Under DOS 2.x and later, calls are routed to the
  1007.         STDOUT driver.
  1008.  
  1009.  
  1010. Function  07h   Direct Console Input Without Echo
  1011.       Get or wait for char at STDIN, returns char in AL
  1012.       (does not check BREAK)
  1013. entry   AH      07h
  1014. return  AL      ASCII character from standard input device
  1015. note 1) Extended ASCII codes require two function calls.  The first
  1016.         call returns 00h to indicate the next call will return an
  1017.         extended code.
  1018.      2) No checking for Ctrl-C or Ctrl-PrtSc is done.
  1019.      3) Input is redirectable.
  1020.      4) TOS: $07 DIRECT CONIN WITHOUT ECHO.  Same as function 01h
  1021.         only does not echo character to screen.
  1022.      5) Under DOS 1.x the keyboard is read directly.  Under DOS 2.x
  1023.         and later the STDIN is polled.
  1024.  
  1025.  
  1026. Function  08h   Console Input Without Echo
  1027.        Get or Wait for char at STDIN, return char in AL
  1028.        (checks BREAK)
  1029. entry   AH      08h
  1030. return  AL      char from standard input device
  1031. note 1) Char is checked for ctrl-C. If ctrl-C is detected, executes
  1032.         int 23h.
  1033.      2) For function call 08h, extended ASCII characters require two
  1034.         function calls.  The first call returns 00h to signify an
  1035.         extended ASCII code.  The next call returns the actual code.
  1036.      3) Input is redirectable.  If redirected, there is no way to
  1037.         check EOF.
  1038.      4) TOS: $08 CONIN WITHOUT ECHO.  Same as previous call. (no
  1039.         checking for control characters).
  1040.      5) Under DOS 1.x the keyboard is read directly.  Under DOS 2.x
  1041.         and later the STDIN is polled.
  1042.  
  1043.  
  1044. Function  09h   Print String
  1045.       Outputs Characters in the Print String to the STDOUT
  1046. entry   AH      09h
  1047.         DS:DX   pointer to the Character String to be displayed
  1048. return  none
  1049. note 1) The character string in memory must be terminated by a $
  1050.         character. (ASCII 24h)
  1051.      2) The $ is not displayed but remains in AL forever unless popped.
  1052.      3) Output to STDOUT is the same as function call 02h.
  1053.      4) TOS: $09 PRINT LINE.  The address of the ASCIIZ string is
  1054.         placed on the stack as a parameter and is printed at the
  1055.         current cursor position.  There is no limit to the size of the
  1056.         string.  D0 contains the number of characters to be printed.
  1057.         Control and escape codes are evaluated.
  1058.      5) Under DOS 1.x, this function writes to the screen.  Under DOS
  1059.         2.x and higher it writes to STDOUT.
  1060.  
  1061.  
  1062. Function  0Ah   Buffered Keyboard Input
  1063.       Reads characters from STDIN and places them in the buffer
  1064.       beginning at the third byte.
  1065. entry   AH      0Ah
  1066.         DS:DX   pointer to an input buffer
  1067. return  none
  1068. note 1) Min buffer size = 1, max = 255.
  1069.      2) Char is checked for ctrl-C. If ctrl-C is detected, executes
  1070.         int 23h.
  1071.      3) Format of buffer DX:
  1072.         byte       contents
  1073.          1      Maximum number of chars the buffer will take,
  1074.                 including CR.  Reading STDIN and filling the buffer
  1075.                 continues until a carriage return (<Enter> or 0Dh) is
  1076.                 read.  If the buffer fills to one less than the maximum
  1077.                 number the buffer can hold, each additional number read
  1078.                 is ignored and ASCII 7 (BEL) is output to the display
  1079.                 until a carriage return is read. (you must set this
  1080.                 value)
  1081.          2      Actual number of characters received, excluding the
  1082.                 carriage return, which is always the last character.
  1083.                 (the function sets this value)
  1084.          3-n    Characters received are placed into the buffer
  1085.                 starting here.  Buffer must be at least as long as the 
  1086.                 number in byte 1.
  1087.          n+1    Carriage return character (0Dh).
  1088.      4) Input is redirectable.  If redirected, there is no way to
  1089.         check EOF.
  1090.      5) The string may be edited with the standard DOS editing
  1091.         commands as it is being entered.
  1092.      6) Extended ASCII characters are stored as 2 bytes, the first
  1093.         byte being zero.
  1094.      7) TOS: $0A READLINE.  Fetches CR-terminated line from CONIN.
  1095.         The address of the buffer is passed as a parameter.  Byte 1
  1096.         is the maximum length of the line, byte 2 is the number of
  1097.         characters entered, byte 3 is the first character.  Escape
  1098.         codes are not interpreted, but the normal editing control
  1099.         characters are.
  1100.      8) Under DOS 1.x the keyboard is read directly.  Under DOS 2.x
  1101.         and later the STDIN is polled.
  1102.  
  1103.  
  1104. Function  0Bh   Check Standard Input (STDIN) status
  1105.       Checks for character available at STDIN
  1106. entry   AH      0Bh
  1107. return  AL      00h     if no character is available from STDIN
  1108.                 0FFh    if a character is available from STDIN
  1109. note 1) Checks for Ctrl-C. If Ctrl-C is detected, int 23h is executed.
  1110.      2) Input can be redirected.
  1111.      3) Checks for character only, it is not read into the application.
  1112.      4) IBM reports that this call does not work properly under the
  1113.         DOSSHELL program in DOS 4.00 and 4.01.  DOSSHELL will return
  1114.         all zeroes.  This function works correctly from the command
  1115.         line or application.
  1116.      5) TOS: $0B CONSTAT.  Checks 64-byte OS input buffer.
  1117.      6) Under DOS 1.x, the type-ahead buffer is checked.  Under DOS
  1118.         2.x and later, the type-ahead buffer is checked unless STDIN
  1119.         has been redirected.
  1120.  
  1121.  
  1122. Function  0Ch   Clear Keyboard Buffer & Invoke a Keyboard Function
  1123.       Dumps buffer, executes function in AL                  (FCB)
  1124. entry   AH      0Ch
  1125.         AL      function number (must be 01h, 06h, 07h, 08h, or 0Ah)
  1126.                 note: the DOS 5.0 TR specifies 0Ah as reserved and
  1127.                        "must not be used"
  1128. return  AL      00h     buffer was flushed, no other processing
  1129.                         performed
  1130.                 other   any other value has no meaning
  1131. note 1) Forces system to wait until a character is typed.
  1132.      2) Flushes all typeahead input, then executes function specified
  1133.         by AL (by moving it to AH and repeating the int 21 call).
  1134.      3) If AL contains a value not in the list above, (such as 00h)
  1135.         the input buffer is flushed and no other action is taken.  Note
  1136.         that this is the STDIN buffer, not the actual keyboard buffer.
  1137.         The keyboard buffer will not be flushed if input is redirected.
  1138.      4) Under DOS 1.x, the type-ahead buffer is emptied before the
  1139.         function in AL is performed.
  1140.  
  1141.  
  1142. Function  0Dh   Disk Reset
  1143.       Flushes all currently open file buffers to disk
  1144. entry   AH      0Dh
  1145. return          none
  1146. note 1) Does not close files.  Does not update directory entries;
  1147.         files changed in size but not closed are not properly
  1148.         recorded in the directory.
  1149.      2) Sets DTA address to DS:0080h
  1150.      3) Should be used before a disk change, Ctrl-C handlers, and to
  1151.         flush the buffers to disk.
  1152.      4) This call is explicitly supported in the OS/2 1.x DOS
  1153.         Compatibility Box.
  1154.      5) IBM TopView saves DTA information during task switches.
  1155.  
  1156.  
  1157. Function  0Eh   Select Disk
  1158.       Sets the drive specified in DL (if valid) as the default drive
  1159. entry   AL      0Eh
  1160.         DL      new default drive number (0=A:,1=B:,2=C:,etc.)
  1161. return  AL      number of physical drives found unless LASTDRIVE= is
  1162.                 included in CONFIG.SYS and specifies a higher number
  1163.                 than that of the last physical drive.
  1164. note 1) For DOS 1.x and 2.x, the minimum value for AL is 2.
  1165.      2) For DOS 3.x and 4.x, the minimum value for AL is 5.
  1166.      3) The drive number returned is not necessarily a valid drive.
  1167.      4) For DOS 1.x: 16 logical drives are available, A-P. (0-0Fh) 
  1168.         For DOS 2.x: 63 logical drives are available. (Letters are only
  1169.                      used for the first 26 drives.  If more than 26
  1170.                      logical drives are used, further drive letters
  1171.                      will be other ASCII characters, such as {, ],
  1172.                      etc. (0-3Fh)
  1173.         For DOS 3.x, +: 26 logical drives are available, A-Z. (0-19h)
  1174.      5) TOS: $0E SETDRV.  A 16-bit parameter with drivespec is passed
  1175.         to TOS.  On exit, D0 contains the number of the drive active
  1176.         before the call. (not the total number of drives)
  1177.      6) This call is explicitly supported in the OS/2 1.x DOS
  1178.         Compatibility Box.
  1179.      7) For DOS 3.3, LASTDRIVE= is not needed when accessing
  1180.         additional hard disk partitions past E:.  I haven't done any
  1181.         further checking, but it seems that LASTDRIVE= may be fairly
  1182.         useless to most programs.
  1183.      6) IBM TopView saves DTA information during task switches.
  1184.  
  1185.  
  1186. Function  0Fh   Open Disk File                                  (FCB)
  1187.       Searches current directory for specified filename and places
  1188.       relevantinformation into the File Control Block.
  1189. entry   AH      0Fh
  1190.         DS:DX   pointer to an unopened FCB
  1191. return  AL      00h     if file found
  1192.                 0FFh    if file not not found
  1193. note 1) If the drive code was 0 (default drive) it is changed to the
  1194.         actual drive used (1=A:,2=B:,3=C:, etc).  This allows changing
  1195.         the default drive without interfering with subsequent
  1196.         operations on this file.
  1197.      2) The current block field (FCB bytes C-D, offset 0Ch) is set to
  1198.         zero.
  1199.      3) The size of the record to be worked with (FCB bytes E-F, offset
  1200.         0Eh) is set to the system default of 80h.  The size of the file
  1201.         (offset 10h) and the date (offset 14h) are set from information
  1202.         obtained in the root directory.  You can change the default
  1203.         value for the record size (FCB bytes E-F) or set the random
  1204.         record size and/or current record field.  Perform these actions
  1205.         after the open but before any disk operations.
  1206.      4) With DOS 3.x the file is opened in compatibility mode.
  1207.         (network)
  1208.      5) Microsoft recommends handle function call 3Dh be used instead.
  1209.      6) This call is also used by the APPEND command in DOS 3.2 and 
  1210.         higher.
  1211.      7) Before performing a sequential disk operation on the file, you
  1212.         must set the Current Record field (offset 20h).  Before
  1213.         performing a random disk operation on the file, you must set
  1214.         the Relative Record field (offset 21h).  If the default record
  1215.         size of 128 bytes is incorrect, set it to the correct value.
  1216.  
  1217.  
  1218. Function  10h  Close File                                     (FCB)
  1219.      Closes a File After a File Write
  1220. entry   AH      10h
  1221.         DS:DX   pointer to an opened FCB
  1222. return  AL      00h     if the file is found and closed
  1223.                 0FFh    if the file is not found in the current
  1224.                         directory
  1225. note 1) This function call must be done on open files that are no
  1226.         longer needed, and after file writes to insure all directory
  1227.         information is updated.
  1228.      2) If the file is not found in its correct position in the current
  1229.         directory, it is assumed that the diskette was changed and AL
  1230.         returns 0FFh.  This error return is reportedly not completely
  1231.         reliable with DOS version 2.x.
  1232.      3) If found, the directory is updated to reflect the status in the
  1233.         FCB, the buffers to that file are flushed, and AL returns 00h.
  1234.      4) There is a subtle but dangerous quirk to this function.  If a
  1235.         Close request is issued using a File Control Block that has
  1236.         not been previously activated by a successful Open command, the
  1237.         file's length will be truncated to zero and the clusters
  1238.         previously assigned to the file are left floating. (lost 
  1239.         clusters)
  1240.      5) This function works for files in the current directory only.
  1241.      6) For DOS 3.1 and later, files opened with this call are set to
  1242.         compatibility mode and the access code is set to read/write.
  1243.      7) For DOS 3.0 and later, int 21h fn 59h (Get Extended Error
  1244.         Information) may be used to determine errors.
  1245.  
  1246.  
  1247. Function  11h   Search For First Matching Entry                  (FCB)
  1248.       Searches current disk & directory for first matching filename
  1249. entry   AH      11h
  1250.         DS:DX   pointer to address of FCB
  1251. return  AL      00h     successful match
  1252.                 0FFh    no matching filename found
  1253. note 1) The FCB may contain the wildcard character ? under DOS 2.x,
  1254.         and ? or * under 3.x and later.
  1255.      2) The original FCB at DS:DX contains information to continue the
  1256.         search with function 12h, and should not be modified.
  1257.      3) If a matching filename is found, AL returns 00h and the
  1258.         locations at the Disk Transfer Address are set as follows:
  1259.         a) If the FCB provided for searching was an extended FCB, then
  1260.            the first byte at the disk transfer address is set to 0FFh
  1261.            followed by 5 bytes of zeroes, then the attribute byte from
  1262.            the search FCB, then the drive number used (1=A, 2=B, etc)
  1263.            then the 32 bytes of the directory entry.  Thus, the disk
  1264.            transfer address contains a valid unopened FCB with the same
  1265.            search attributes as the search FCB.
  1266.         b) If the FCB provided for searching was a standard FCB, then
  1267.            the first byte is set to the drive number used (1=A, 2=b,
  1268.            etc), and the next 32 bytes contain the matching directory
  1269.            entry.  Thus, the disk transfer address contains a valid
  1270.            unopened normal FCB.
  1271.      4) If an extended FCB is used, the following search pattern is
  1272.         used:
  1273.         a) If the FCB attribute byte is zero, only normal file entries
  1274.            are found.  Entries for volume label, subdirectories, hidden
  1275.            or system files, are not returned.
  1276.         b) If the attribute byte is set for hidden or system files, or
  1277.            subdirectory entries, it is to be considered as an inclusive
  1278.            search.  All normal file entries plus all entries matching
  1279.            the specified attributes are returned.  To look at all
  1280.            directory entries except the volume label, the attribute byte
  1281.            may be set to hidden + system + directory (all 3 bits on).
  1282.         c) If the attribute field is set for the volume label, it is
  1283.            considered an exclusive search, and ONLY the volume label
  1284.            entry is returned.
  1285.      5) This call is also used by the APPEND command in DOS 3.2+
  1286.  
  1287.  
  1288. Function  12h   Search For Next Entry Using FCB                 (FCB)
  1289.       Search for next matching filename
  1290. entry   AH      12h
  1291.         DS:DX   pointer to the unopened FCB specified from the previous
  1292.                 Search
  1293.                 First (11h) or Search Next (12h)
  1294. return  AL      00h     if matching filename found
  1295.                 0FFh    if matching filename was not found
  1296. note 1) After a matching filename has been found using function call
  1297.         11h, function 12h may be called to find the next match to an
  1298.         ambiguous request.  For DOS 2.x, ?'s are allowed in the
  1299.         filename.  For DOS 3.x and 4.x, global (*) filename characters
  1300.         are allowed.
  1301.      2) The DTA contains info from the previous Search First or Search
  1302.         Next.
  1303.      3) Do not perform any disk operations with this FCB between a
  1304.         previous function 11h or 12h call and this one.  "Undocumented"
  1305.         fields in the FCB are used to keep information necessary for
  1306.         continuing the search, and some disk operations may overwrite
  1307.         these areas.
  1308.      4) If the file is found, an FCB is created at the DTA address and
  1309.         set up to open or delete it.
  1310.  
  1311.  
  1312. Function  13h   Delete File Via FCB                              (FCB)
  1313.       Deletes file specified in FCB from current directory
  1314. entry   AH      13h
  1315.         DS:DX   pointer to address of FCB
  1316. return  AL      00h     file deleted
  1317.                 0FFh    if file not found or was read-only
  1318. note 1) All matching current directory entries are deleted. The global
  1319.         filename character "?" is allowed in the filename.
  1320.      2) Will not delete files with read-only attribute set.
  1321.      3) Close open files before deleting them.
  1322.      4) For DOS 3.1+, requires network Create rights to the sub-
  1323.         directory.
  1324.      5) This call supports wildcards and is very fast.  The "new"
  1325.         handle call 41h is supposed to replace this one since it knows
  1326.         about subdirectories.  Unfortunately, fn 41h doesn't know about
  1327.         wildcards.
  1328.  
  1329.  
  1330. Function  14h   Sequential Disk File Read                         (FCB)
  1331.       Reads record sequentially from disk via FCB
  1332. entry   AH  14h
  1333.         DS:DX   pointer to an opened FCB
  1334. return  AL      00h     successful read
  1335.                 01h     end of file (no data read)
  1336.                 02h     Data Transfer Area too small for record size
  1337.                         specified or segment overflow
  1338.                 03h     partial record read, EOF found
  1339. note 1) The record size is set to the value at offset 0Eh in the FCB.
  1340.      2) The record pointed to by the Current Block (offset 0Ch) and the
  1341.         Current Record (offset 20h) fields is loaded at the DTA, then
  1342.         the Current Block and Current Record fields are incremented.
  1343.      3) The record is read into memory at the current DTA address as
  1344.         specified by the most recent call to function 1Ah.  If the size
  1345.         of the record and location of the DTA are such that a segment
  1346.         overflow or wraparound would occur, the error return is set to
  1347.         AL=02h.
  1348.      4) If a partial record is read at the end of the file, it is passed
  1349.         to the requested size with zeroes and the error return is set to
  1350.         AL=03h.
  1351.      5) For DOS 3.1+ networks, requires Read rights to the subdirectory.
  1352.  
  1353.  
  1354. Function  15h   Sequential Disk Write                              (FCB)
  1355.       Writes record specified by FCB sequentially to disk
  1356. entry   AH      15h
  1357.         DS:DX   pointer to address of FCB
  1358. return  AL      00h     successful write
  1359.                 01h     diskette full, write canceled
  1360.                 02h     disk transfer area (DTA) too small or segment
  1361.                         wrap
  1362. note 1) The data to write is obtained from the disk transfer area.
  1363.      2) The record size is set to the value at offset 0Eh in the FCB.
  1364.      3) This service cannot write to files set as read-only.
  1365.      4) The record pointed to by the Current Block (offset 0Ch) and the
  1366.         Current Record (offset 20h) fields is loaded at the DTA, then
  1367.         the Current Block and Current Record fields are incremented.
  1368.      5) If the record size is less than a sector, the data in the DTA
  1369.         is written to a buffer; the buffer is written to disk when it
  1370.         contains a full sector of data, the file is closed, or a Reset
  1371.         Disk (function 0Dh) is issued.
  1372.      6) The record is written to disk at the current DTA address as
  1373.         specified by the most recent call to function 1Ah.  If the size
  1374.         of the record and location of the DTA are such that a segment
  1375.         overflow or wraparound would occur, the error return is set to
  1376.         AL=02h.
  1377.      5) For DOS 3.1+ networks, requires Write rights to the subdirectory.
  1378.  
  1379.  
  1380. Function  16h   Create A Disk File                                (FCB)
  1381.       Search and open or create directory entry for file
  1382. entry   AH      16h
  1383.         DS:DX   pointer to an FCB
  1384. return  AL      00h     successful creation
  1385.                 0FFh    no room in directory
  1386. note 1) If a matching directory entry is found, the file is truncated
  1387.         to zero bytes.
  1388.      2) If there is no matching filename, a filename is created.
  1389.      3) This function calls function 0Fh (Open File) after creating or
  1390.         truncating a file.
  1391.      4) A hidden file can be created by using an extended FCB with the
  1392.         attribute byte (offset FCB-1) set to 2.
  1393.      5) The corresponding handle call is 3Ch.
  1394.      6) For DOS 3.1+ networks, requires  Create rights to the sub-
  1395.         directory.
  1396.      7) For DOS 3.0 and later, int 21h function 59h (Get Extended Error
  1397.         Information) may be used to determine errors.
  1398.      8) Pathnames and wildcards are not supported.
  1399.  
  1400.  
  1401. Function  17h   Rename File Specified by File Control Block       (FCB)
  1402.       Renames file in current directory
  1403. entry   AH      17h
  1404.         DS:DX   pointer to an FCB (see note 4)
  1405. return  AL      00h     successfully renamed
  1406.                 0FFh    file not found or filename already exists
  1407. note 1) This service cannot rename read-only files.
  1408.      2) The "?" wildcard may be used.
  1409.      3) If the "?" wildcard is used in the second filename, the
  1410.         corresponding letters in the filename of the directory entry are
  1411.         not changed.
  1412.      4) A special modified FCB is used. It must have a drive number,
  1413.         filename, and extension in the usual position, and a second
  1414.         filename starting 6 bytes after the first, at offset 11h.  This
  1415.         is normally a "reserved" area.
  1416.         Modified FCB format:
  1417.         bytes           contents
  1418.         00h       drive number
  1419.         01h-08h   old filename (blank padded if required)
  1420.         09h-0Bh   old file extension (blank padded if reqired)
  1421.         0Ch-10h   zeroed out
  1422.         11h-18h   new filename (blank padded if required)
  1423.         19h-1Bh   new file extension (blank padded if required)
  1424.         1Ch-24h   zeroed out
  1425.      5) The two filenames cannot have the same name.
  1426.      6) FCB contains new name starting at byte 17h.
  1427.      7) Under DOS 2.0+, subdirectories may be renamed with this call.
  1428.  
  1429.  
  1430. Function  18h  Unknown - reportedly not used
  1431. entry   AH      18h
  1432. return  AL      00h
  1433.  
  1434.  
  1435. Function  19h   Get Current Disk Drive
  1436.       Return designation of current default disk drive
  1437. entry   AH      19h
  1438. return  AL      current default drive (0=A, 1=B,etc.)
  1439. note 1) Some other DOS functions use 0 for default, 1=A, 2=B, etc.
  1440.      2) This call is explicitly supported in the OS/2 1.x
  1441.         Compatibility Box.
  1442.      3) TOS: $19 CURRENT DISK. D0 returns number of drive (0=A:)
  1443.  
  1444.  
  1445. Function  1Ah   Set Disk Transfer Area Address (DTA)
  1446.       Sets DTA address to the address specified in DS:DX.
  1447.       Required for functions 4Eh and 4Fh.
  1448. entry   AH      1Ah
  1449.         DS:DX   pointer to DTA buffer
  1450. return  none
  1451. note 1) The default DTA is 128 bytes at offset 80h in the PSP.  You may
  1452.         set up your own DTA with any size and location.  The DTA should
  1453.         be large enough to handle the largest record you intend to write.
  1454.      2) Registers are unchanged.
  1455.      3) No error codes are returned.
  1456.      4) Disk transfers cannot wrap around from the end of the segment
  1457.         to the beginning or overflow into another segment.
  1458.      5) DOS uses the DTA for file I/O. (see Chapter 6)
  1459.      6) This call is explicitly supported in the OS/2 1.x
  1460.         Compatibility Box.
  1461.      7) TOS: $1A SET DISK TRANSFER ADDRESS. Sets up a 44-byte buffer for
  1462.         disk operations.
  1463.      8) PC-MOS/386: not supported for native 386 mode MOS applications.
  1464.  
  1465.  
  1466. Function  1Bh   Get Current Drive File Allocation Table Information
  1467.       Returns information from the FAT on the current drive
  1468. entry   AH      1Bh
  1469. return  AL      number of sectors per allocation unit (cluster)
  1470.         CX      number of bytes per sector
  1471.         DS:BX   address of the current drive's media descriptor byte
  1472.         DX      number of allocation units (clusters) for default drive
  1473. note 1) Save DS before calling this function.
  1474.      2) This call returned a pointer to the FAT in DOS 1.x.  Beginning
  1475.         with DOS 2.00, it returns a pointer only to the table's ID byte.
  1476.      3) IBM recommends programmers avoid this call and use int 25h
  1477.         instead.
  1478.      4) Offset DS:[BX-1] is the dirty byte for the table: 00=clean,
  1479.         01=dirty.
  1480.      5) DOS 2.x+ and above do not keep the FAT in RAM.  Do not use this
  1481.         call to access the FAT.  Function 36 is preferred.
  1482.      6) If unsuccessful, AL returns with 0FFh.
  1483.  
  1484.  
  1485. Function  1Ch   Get File Allocation Table Information for Drive
  1486.       Returns information on specified drive
  1487. entry   AH      1Ch
  1488.         DL      drive number (1=A, 2=B, 3=C, etc)
  1489. return  AL      number of sectors per allocation unit (cluster)
  1490.                 0FFh    invalid drive specification
  1491.         DS:BX   address of media descriptor byte for drive in DL
  1492.         CX      sector size in bytes
  1493.         DX      number of allocation units (clusters)
  1494. note 1) Set DL = 0 for default.
  1495.      2) Save DS before calling this function.
  1496.      3) Format of media-descriptor byte:
  1497.         bits:   0       0   (clear)   not double sided
  1498.                         1   (set)     double sided
  1499.                 1       0   (clear)   not 8 sector
  1500.                         1   (set)     8 sector
  1501.                 2       0   (clear)   nonremovable device
  1502.                         1   (set)     removable device
  1503.                 3-7     always set (1)
  1504.      4) This call returned a pointer to the FAT in DOS 1.x.  Beginning
  1505.         with DOS 2.00, it returns a pointer only to the table's ID byte.
  1506.      5) IBM recommends programmers avoid this call and use int 25h
  1507.         instead.
  1508.      6) This function reads the BPB only and is very fast.
  1509.      7) If unsuccessful, AL returns with 0FFh.
  1510.      8) PC-MOS/386: native mode should use DS:EBX instead of DS:BX.
  1511.  
  1512.  
  1513. Function  1Dh   Not Documented by Microsoft
  1514.  *    Unknown - reportedly not used
  1515. entry   AH      1Dh
  1516. return  AL      00h
  1517.  
  1518.  
  1519. Function  1Eh   Not Documented by Microsoft
  1520.  *    Unknown - reportedly not used
  1521. entry   AH      1Eh
  1522. return  AL      00h
  1523. note    Apparently does nothing.
  1524.  
  1525.  
  1526. Function  1Fh   Get Default Drive Parameter Block
  1527.     Same as function call 32h (below), except that the table is
  1528.     accessed from the default drive
  1529. entry   AH      1Fh
  1530.         other registers unknown
  1531. return  AL      00h     no error
  1532.                 0FFh    error
  1533.         DS:BX   pointer to DOS Disk Parameter Block for default drive.
  1534. note    For DOS 2, 3, 4.x, this just invokes function 32h (Read DOS
  1535.         Disk Block) with DL=0.
  1536.  
  1537.  
  1538. Function  20h  Unknown
  1539.  *   Internal - does nothing?
  1540. entry   AH      20h
  1541. return  AL      00h
  1542.  
  1543.  
  1544. Function  21h  Random Read from File Specified by File Control Block (FCB)
  1545.      Reads one record as specified in the FCB into the current DTA.
  1546. entry   AH      21h
  1547.         DS:DX   address of the opened FCB
  1548. return  AL      00h     successful read operation
  1549.                 01h     end of file (EOF), no data read
  1550.                 02h     DTA too small for the record size specified
  1551.                 03h     end of file (EOF), partial data read
  1552. note 1) The current block and current record fields are set to agree
  1553.         with the random record field.  Then the record addressed by
  1554.         these fields is read into memory at the current Disk Transfer
  1555.         Address.
  1556.      2) The current file pointers are NOT incremented this function.
  1557.      3) If the DTA is larger than the file, the file is padded to the
  1558.         requested length with zeroes.
  1559.  
  1560.  
  1561. Function  22h  Random Write to File Specified by FCB              (FCB)
  1562.      Writes one record as specified in the FCB to the current DTA
  1563. entry   AH      22h
  1564.         DS:DX   address of the opened FCB
  1565. return  AL      00h     successful write operation
  1566.                 01h     disk full; no data written (write was canceled)
  1567.                 02h     DTA too small for the record size specified
  1568.                         (write was canceled)
  1569. note 1) This service cannot write to read-only files.
  1570.      2) The record pointed to by the Current Block (offset 0Ch) and the
  1571.         Current Record (offset 20h) fields is loaded at the DTA, then
  1572.         the Current Block and Current Record fields are incremented.
  1573.      3) If the record size is less than a sector, the data in the DTA is
  1574.         written to a buffer; the buffer is written to disk when it
  1575.         contains a full sector of data, the file is closed, or a Reset
  1576.         Disk (function 0Dh) is issued.
  1577.      4) The current file pointers are NOT incremented this function.
  1578.      5) The record is written to disk at the current DTA address as
  1579.         specified by the most recent call to function 1Ah.  If the size
  1580.         of the record and location of the DTA are such that a segment
  1581.         overflow or wraparound would occur, the error return is set to
  1582.         AL=02h.
  1583.      6) Under networks running DOS 3.1 or later, the user must have
  1584.         Write access rights to the subdirectory.
  1585.  
  1586.  
  1587. Function  23h  Get File Size                                       (FCB)
  1588.      Searches current subdir for matching file, returns size in FCB
  1589. entry   AH      23h
  1590.         DS:DX   address of an unopened FCB
  1591. return  AL      00h file found
  1592.                 0FFh file not found
  1593. note 1) Record size field (offset 0Eh) must be set before invoking this
  1594.         function.
  1595.      2) The disk directory is searched for the matching entry.  If a
  1596.         matching entry is found, the random record field is set to the
  1597.         number of records in the file.  If the value of the Record Size
  1598.         field is not an even divisor of the file size, the value set in
  1599.         the relative record field is rounded up.  This gives a returned
  1600.         value larger than the actual file size.
  1601.      3) This call is used by the APPEND command in DOS 3.2+.
  1602.      4) Record numbers start with zero.
  1603.  
  1604.  
  1605. Function  24h  Set Relative Record Field                           (FCB)
  1606.      Set random record field specified by an FCB
  1607. entry   AH      24h
  1608.         DS:DX   address of an opened FCB
  1609. return  Random Record Field of FCB is set to be same as Current Block
  1610.         and Current Record.
  1611. note 1) You must invoke this function before performing random file
  1612.         access.
  1613.      2) The relative record field of FCB (offset 21h) is set to be same
  1614.         as the Current Block (offset 0Ch) and Current Record (offset
  1615.         20h).
  1616.      3) No error codes are returned.
  1617.      4) The FCB must already be opened.
  1618.  
  1619.  
  1620. Function  25h  Set Interrupt Vector
  1621. entry   AH      25h
  1622.         AL      interrupt number to reassign the handler to
  1623.         DS:DX   address of new interrupt vector
  1624. return  none
  1625. note 1) Registers are unchanged.
  1626.      2) No error codes are returned.
  1627.      3) The interrupt vector table for the interrupt number specified
  1628.         in AL is set to the address contained in DS:DX.  Use function
  1629.         35h (Get Vector) to get the contents of the interrupt vector
  1630.         and save it for later use.
  1631.      4) When you use function 25 to set an interrupt vector, DOS 3.2
  1632.         doesn't point the actual interrupt vector to what you requested.
  1633.         Instead, it sets the interrupt vector to point to a routine
  1634.         inside DOS, which does this:
  1635.                 1. Save old stack pointer
  1636.                 2. Switch to new stack pointer allocated from DOS's
  1637.                    stack pool
  1638.                 3. Call your routine
  1639.                 4. Restore old stack pointer
  1640.         The purpose for this was to avoid possible stack overflows when
  1641.         there are a large number of active interrupts.  IBM was
  1642.         concerned (this was an IBM change, not Microsoft) that on a
  1643.         Token Ring network there would be a lot of interrupts going on,
  1644.         and applications that hadn't allocated very much stack space
  1645.         would get clobbered.
  1646.      5) This call is explicitly supported in the OS/2 1.x
  1647.         Compatibility Box.
  1648.      6) This call is used to access the Phar Lap DOS extender's
  1649.         protected mode functions.  The Phar Lap function number is
  1650.         placed in AL.
  1651.  
  1652.  
  1653. Function  26h  Create New Program Segment Prefix (PSP)
  1654.      This service copies the current program-segment prefix to a new
  1655.      memory location for the creation of a new program or overlay.
  1656.      Once the new PSP is in place, a DOS program can read a DOS .COM
  1657.      or overlay file into the memory location immediately following
  1658.      the new PSP and pass control to it.
  1659. entry   AH      26h
  1660.         DX      segment number for the new PSP
  1661. return  Current PSP is copied to specified segment
  1662. note 1) Microsoft recommends you use the newer DOS service 4Bh (EXEC)
  1663.         instead.
  1664.      2) The entire 100h area at location 0 in the current PSP is copied
  1665.         into location 0 of the new PSP.  The memory size information at
  1666.         location 6 in the new segment is updated and the current
  1667.         termination, ctrl-break, and critical error addresses from the
  1668.         interrupt vector table entries for ints 22h, 23h, and 24 are
  1669.         saved in the new program segment starting at 0Ah.  They are
  1670.         restored from this area when the program terminates.
  1671.      3) The PSP structure is found in Chapter 6.
  1672.  
  1673.  
  1674. Function  27h  Random Block Read From File Specified by FCB
  1675.      Similar to 21h (Random Read) except allows multiple files to be
  1676.      read.
  1677. entry   AH      27h
  1678.         CX      number of records to be read
  1679.         DS:DX   address of an opened FCB
  1680. return  AL      00h     successful read
  1681.                 01h     end of file, no data read
  1682.                 02h     DTA too small for record size specified
  1683.                         (read canceled)
  1684.                 03h     end of file
  1685.         CX      actual number of records read (includes partial if
  1686.                 AL=03h)
  1687. note 1) The record size is specified in the FCB.  The service updates
  1688.         the Current Block (offset 0Ch) and Current Record (offset 20h)
  1689.         fields to the next record not read.
  1690.      2) If CX contained 0 on entry, this is a NOP.
  1691.      3) If the DTA is larger than the file, the file is padded to the
  1692.         requested length with zeroes.
  1693.      4) This function assumes that the FCB record size field (0Eh) is
  1694.         correctly set.  If not set by the user, the default is 128
  1695.         bytes.
  1696.      5) The record is written to disk at the current DTA address as
  1697.         specified by the most recent call to function 1Ah.  If the size
  1698.         of the record and location of the DTA are such that a segment
  1699.         overflow or wraparound would occur, the error return is set to
  1700.         AL=02h.
  1701.      6) Under networks running DOS 3.1 or later, the user must have
  1702.         Read access rights to the subdirectory.
  1703.  
  1704.  
  1705. Function  28h  Random Block Write to File Specified in FCB
  1706.      Similar to 27h (Random Write)     
  1707. entry   AH      28h
  1708.         CX      number of records to write
  1709.         DS:DX   address of an opened FCB
  1710. return  AL      00h     successful write
  1711.                 01h     disk full, no data written
  1712.                 02h     DTA too small for record size specified
  1713.                         (write canceled)
  1714.         CX      number of records written
  1715. note 1) The record size is specified in the FCB.
  1716.      2) This service allocates disk clusters as required.
  1717.      3) This function assumes that the FCB Record Size field (offset
  1718.         0Eh) is correctly set.  If not set by the user, the default is
  1719.         128 bytes.
  1720.      4) The record size is specified in the FCB.  The service updates
  1721.         the Current Block (offset 0Ch) and Current Record (offset 20h)
  1722.         fields to the next record not read.
  1723.      5) The record is written to disk at the current DTA address as
  1724.         specified by the most recent call to function 1Ah.  If the size
  1725.         of the record and location of the DTA are such that a segment
  1726.         overflow or wraparound would occur, the error return is set to
  1727.         AL=02h.
  1728.      6) If called with CX=0, no records are written, but the FCB's File
  1729.         Size entry (offset 1Ch) is set to the size specified by the
  1730.         FCB's Relative Record field (offset 21h).
  1731.      7) Under networks running DOS 3.1 or later, the user must have
  1732.         Write access rights to the subdirectory.
  1733.  
  1734.  
  1735. Function  29h  Parse the Command Line for Filename
  1736.      Parses a text string into the fields of a File Control Block
  1737. entry   AH      29h
  1738.         AL      bit mask to control parsing
  1739.             bit 0    0     parsing stops if file seperator found
  1740.                      1     causes service to scan past leading chars
  1741.                            such as blanks.  Otherwise assumes the
  1742.                            filename begins in the first byte
  1743.                 1    0     drive number in FCB set to default (0) if 
  1744.                            the string contains no drive number
  1745.                      1     drive number in FCB not changed
  1746.                 2    0     filename in FCB set to 8 blanks if no
  1747.                            filename in string
  1748.                      1     filename in FCB not changed if string does
  1749.                            not contain a filename
  1750.                 3    0     extension in FCB set to 3 blanks if no
  1751.                            extension in string
  1752.                      1     extension left unchanged
  1753.                 4-7  must be zero
  1754.         DS:SI   pointer to string to parse
  1755.         ES:DI   pointer to memory buffer to fill with unopened FCB
  1756. return  AL      00h     no wildcards in name or extension
  1757.                 01h     wildcards appeared in name or extension
  1758.                 0FFh    invalid drive specifier
  1759.         DS:SI   pointer to the first byte after the parsed string
  1760.         ES:DI   pointer to a buffer filled with the unopened FCB
  1761. note 1) If the * wildcard characters are found in the command line, this
  1762.         service will replace all subsequent chars in the FCB with
  1763.         question marks.
  1764.      2) This service uses the characters as filename separators
  1765.         DOS 1       : ; . , + / [ ] = " TAB SPACE
  1766.         DOS 2,3,4   : ; . , + = TAB SPACE
  1767.      3) This service uses the characters
  1768.         : ; . , + < > | / \ [ ] = " TAB SPACE
  1769.         or any control characters as valid filename separators.
  1770.      4) A filename cannot contain a filename terminator.  If one is
  1771.         encountered, all processing stops.  The handle functions will
  1772.         allow use of some of these characters.
  1773.      5) If no valid filename was found on the command line, ES:DI +1
  1774.         points to a blank (ASCII 32).
  1775.      6) This call will not handle pathnames.
  1776.      7) Parsing is in the form D:FILENAME.EXT.  If one is found, a
  1777.         corresponding unopened FCB is built at ES:DI.
  1778.  
  1779.  
  1780. Function  2Ah  Get Date
  1781.      Returns day of the week, year, month, and date
  1782. entry   AH      2Ah
  1783. return  CX      year    (1980-2099)
  1784.         DH      month   (1-12)
  1785.         DL      day     (1-31)
  1786.         AL      weekday 00h     Sunday
  1787.                         01h     Monday
  1788.                         02h     Tuesday
  1789.                         03h     Wednesday
  1790.                         04h     Thursday
  1791.                         05h     Friday
  1792.                         06h     Saturday
  1793. note 1) Date is adjusted automatically if clock rolls over to the next
  1794.         day, and takes leap years and number of days in each month into
  1795.         account.
  1796.      2) Although DOS cannot set an invalid date, it can read one, such
  1797.         as 91/32/80, etc.
  1798.      3) DESQview's DOS subfunctions also accept CX = 4445h and DX =
  1799.         5351h, i.e. 'DESQ' as valid.
  1800.      4) This call is explicitly supported in the OS/2 1.x
  1801.         Compatibility Box.
  1802.      5) DOS will accept CH=0 (midnight) as a valid time.  Through DOS
  1803.         3.31, if a file's time is set to within 2 seconds of midnight
  1804.         the time will not be displayed by the DIR command.  For DOS
  1805.         4.0+ and DR-DOS the creation time will always be displayed.
  1806.      6) TOS: $2A GET DATE.
  1807.  
  1808.  
  1809. Function  2Bh  Set Date
  1810.      set current system date
  1811. entry   AH      2Bh
  1812.         CX      year    (1980-2099)
  1813.         DH      month   (1-12)
  1814.         DL      day     (1-31)
  1815. return  AL      00h     no error (valid date)
  1816.                 0FFh    invalid date specified
  1817. note 1) On entry, CX:DX must have a valid date in the same format as
  1818.         returned by function call 2Ah.
  1819.      2) DOS 3.3+ also sets CMOS clock.
  1820.      3) Under the DESQview system shell, this is the DV_GET_VERSION
  1821.         check:
  1822.         entry   AH      2Bh
  1823.                 AL      01h     DESQ call
  1824.                 CX      4445h   'DE'               (invalid date used
  1825.                 DX      5351h   'SQ'                for DesQview ID)
  1826.         return  AH      major version
  1827.                 AL      minor version
  1828.                 AX      0FFh    DESQ not installed (DOS error code)
  1829.      4) For DESQview 2.00+, installation check
  1830.         entry   AH      2Bh
  1831.                 AL      subfunction (DV v2.00+)
  1832.                         01h     Get Version
  1833.         return  BX      version (BH = major, BL = minor)
  1834.         note    Early copies of v2.00 return 0002h.
  1835.                         02h     Get Shadow Buffer Info, and Start
  1836.                                 Shadowing
  1837.         return  BH      rows in shadow buffer
  1838.                 BL      columns in shadow buffer
  1839.                 DX      segment of shadow buffer
  1840.                         04h     Get Shadow Buffer Info
  1841.         return  BH      rows in shadow buffer
  1842.                 BL      columns in shadow buffer
  1843.                 DX      segment of shadow buffer
  1844.                         05h     Stop Shadowing
  1845.                 CX      4445h ('DE')
  1846.                 DX      5351h ('SQ')
  1847.         return  AL      0FFh    if DESQview not installed
  1848.         note    In DESQview v1.x, there were no subfunctions; this
  1849.                 call only identified whether or not DESQview was loaded.
  1850.      5) PC-Tools PC-Cache 5.1 (Multisoft cache) installation check.
  1851.         entry   CX      4358h ('CX')
  1852.         return  AL      00h     installed
  1853.                                 CX      6378h
  1854.                         0FFh    not installed
  1855.      6) This call is explicitly supported in the OS/2 1.x
  1856.         Compatibility Box.
  1857.      7) TOS: GET DATE.
  1858.  
  1859.  
  1860. Function  2Ch  Get Time
  1861.      Get current system time from CLOCK$ driver
  1862. entry   AH      2Ch
  1863. return  CH      hours   (0-23)
  1864.         CL      minutes (0-59)
  1865.         DH      seconds (0-59)
  1866.         DL      hundredths of a second (0-99)
  1867. note 1) Time is updated every 5/100 second.
  1868.      2) The date and time are in binary format.
  1869.      3) This call is explicitly supported in the OS/2 1.x
  1870.         Compatibility Box.
  1871.      4) TOS: GET TIME.
  1872.  
  1873.  
  1874. Function  2Dh  Set Time
  1875.      Sets current system time
  1876. entry   AH      2Dh
  1877.         CH      hours   (0-23)
  1878.         CL      minutes (0-59)
  1879.         DH      seconds (0-59)
  1880.         DL      hundredths of seconds (0-99)
  1881. return  AL      00h     if no error
  1882.                 0FFh    if bad value sent to routine
  1883. note 1) DOS 3.3+ also sets CMOS clock.
  1884.      2) CX and DX must contain a valid time in binary.
  1885.      3) This call is explicitly supported in the OS/2 1.x
  1886.         Compatibility Box.
  1887.      4) TOS: SET TIME.
  1888.  
  1889.  
  1890. Function  2Eh  Set/Reset Verify Switch
  1891.      Set verify flag
  1892. entry   AH      2Eh
  1893.         AL      00      to turn verify off (default)
  1894.                 01      to turn verify on
  1895.         DL      00h     (DOS 1.x and 2.x only, according to Microsoft's
  1896.                          MS-DOS Encyclopedia.  My IBM 2.0 and Intel 2.0
  1897.                          manuals don't show DL being used)
  1898. return  none
  1899. note 1) This is the call invoked by the DOS VERIFY command.
  1900.      2) The setting of the Verify switch can be obtained by calling
  1901.         function 54h.
  1902.      3) This call is not supported on network drives.
  1903.      4) DOS checks this flag each time it accesses a disk or block
  1904.         device.
  1905.      5) This call is explicitly supported in the OS/2 1.x
  1906.         Compatibility Box.
  1907.  
  1908.  
  1909. Function  2Fh  Get Disk Transfer Address (DTA)
  1910.      Returns current DTA used by all DOS read/write operations
  1911. entry   AH      2Fh
  1912. return  ES:BX   address of DTA
  1913. note 1) The DTA is set by function call 1Ah
  1914.      2) Default DTA address is a 128 byte buffer at offset 80h in that
  1915.         program's Program Segment Prefix.
  1916.      3) See Chapter 6 for a description of the DTA.
  1917.      4) This call is explicitly supported in the OS/2 1.x
  1918.         Compatibility Box.
  1919.      5) TOS: GET DTA. Returns segment address of current DTA in D0.
  1920.  
  1921.  
  1922. Function  30h  Get DOS Version Number
  1923.      Return DOS version and/or user number
  1924. entry   AH      30h
  1925.  (5.0+) AL      00h     Get OEM ID number
  1926.                 01h     Get version flag
  1927. return  AH      minor version number  (i.e., DOS 2.10 returns AX = 0A02h)
  1928.                                       (AH undefined for DOS 1.x)
  1929.         AL      major version number  (0 for DOS 1.x, 02h for 2.x, 05h
  1930.                                        for 5.x)
  1931.  
  1932. (DOS 2.0 through 4.01)
  1933.         BH      OEM ID number
  1934.                 00h     IBM DOS
  1935.                 16h     DEC DOS
  1936.                 0FFh    MS-DOS (generic) (Also Toshiba DOS 5.0)
  1937.  
  1938. (DOS 5.0+ called with AL=00h)
  1939.         BH      OEM ID number
  1940.                 (see above)
  1941.  
  1942. (DOS 5.0+ called with AL=01h)
  1943.         BH      version flag
  1944.                 08h     DOS 5.0 or higher running out of ROM
  1945.                         (all other bits are reserved and set to zero)
  1946.  
  1947.         BL:CX   24-bit user serial number (optional, OEM dependent.
  1948.                 If not used this field returns zeroes)
  1949. note 1) If AL returns a major version number of zero, the DOS version
  1950.         is below 1.28 for MSDOS and below 2.00 for PCDOS.
  1951.      2) IBM PC-DOS always returns 0000h in BX and CX, as does DR-DOS.
  1952.      3) Due to OS/2 returning version numbers over 10 and the fact
  1953.         that some European versions of DOS carried higher version
  1954.         numbers than IBM's DOS, utilities which check for a DOS version
  1955.         should not abort if a higher version than required is found
  1956.         unless some specific problems are known.
  1957.      4) This call is explicitly supported by the OS/2 1.x DOS
  1958.         Compatibility Box.
  1959.      5) TOS: $30 GET VERSION NUMBER.  Returns GEMDOS version number
  1960.         in D0.
  1961.      6) Under PC-MOS/386, if AX=BX=CX=DX, the PC-MOS/386 version number
  1962.         is returned.  If all registers to not hold the same value, an
  1963.         MSDOS equivalent version number is returned.  The PC-MOS/386
  1964.         version number is always different from the MSDOS version number.
  1965.      7) DOS version equivalents:
  1966.         3.20    PC-MOS/386 v3.0
  1967.         3.31    Digital Research DR-DOS 3.40, 3.41, 5.0, 6.0
  1968.         10      OS/2 v1.0 Compatibility Box  (major version number)
  1969.      8) DOS 5.0 adds the AL parameter to the command, but the ID number 
  1970.         returned in BL has been available since MSDOS 2.0, as
  1971.         documented by Intel's DOS 2.0 Technical Reference.
  1972.      9) DOS 5.0's SETVER command can modify the value returned in AX.
  1973.         You must use int 21h/3306h to obtain the true version number.
  1974.     10) OS/2 1.0's Compatibility Box returns version 10.  OS/2 1.1
  1975.         returns version 10.1, etc.  OS/2 2.0 returns version 20.
  1976.     11) If running in a Microsoft Windows 3.0 or later DOS box, the
  1977.         string "windir" will be in the DOS environment.  Note
  1978.         lowercase!
  1979.     12) It may sometimes be necessary to identify DOS-compatible
  1980.         operating systems or replacement command interpreters.  This
  1981.         doesn't appear to be a simple task.
  1982.  
  1983.         COMMAND.COM replacements:
  1984.         1) 4DOS can be identified with int 2Fh, fn 44DDh.
  1985.         2) Command Plus   (unknown)
  1986.         3) FlexShell      (unknown)
  1987.  
  1988.         DOS replacements:
  1989.         1) DR-DOS 3.4x has no easy way to be identified, which is a
  1990.            pity.  Though it has some MS4.0-like characteristics, it
  1991.            reports 3.31 with the DOS call, though VER will return
  1992.            whatever the DRDOS revision is.
  1993.            To identify DRDOS I've noted the following:
  1994.               The string "OS=" appears in the default 
  1995.                       environment (unless the user nulls it out)
  1996.               The OS= string is generated by COMMAND.COM and does not
  1997.                       appear when the user is running 4DOS as a command
  1998.                       interpreter.
  1999.               The internal DOS version call will report 3.31, but the
  2000.                       string returned by VER is at minimum 3.4.
  2001.              For DRDOS 3.x:
  2002.                SHARE and FASTOPEN are always loaded.
  2003.              For DRDOS 5 and 6:
  2004.                SHARE and FASTOPEN are NOT always loaded.
  2005.            The DR-DOS Programmer's Reference doesn't show a call to
  2006.                       identify DR-DOS specifically.
  2007.         2) PC-MOS/386: unknown. Fail an API call?
  2008.         3) Concurrent DOS: unknown. Fail an API call?
  2009.         4) DR Multiuser DOS inserts the string: OS=DRMDOS into the
  2010.                       environment.  Since DRMDOS doesn't allow
  2011.                       replacement of the command interpreter via the
  2012.                       SHELL= statement, OS= will be there unless nulled
  2013.                       by the user.
  2014.  
  2015. Function  31h  Terminate Process and Stay Resident      (KEEP)
  2016. entry   AH      31h
  2017.         AL      exit code
  2018.         DX      program memory requirement in 16 byte paragraphs
  2019. return  AX      return code (retrieveable by function 4Dh)
  2020. note 1) Files opened by the application are not closed when this call
  2021.         is made.
  2022.      2) Memory can be used more efficiently if the block containing the
  2023.         copy of the DOS environment is deallocated before terminating.
  2024.         This can be done by loading ES with the segment contained in 2Ch
  2025.         of the PSP and issuing function call 49h (Free Allocated Memory).
  2026.      3) Unlike int 27h, more than 64k may be made resident with this
  2027.         call.
  2028.      4) TOS: $31 KEEP PROCESS.
  2029.      5) Programs larger than 64k may be made resident with this call.
  2030.      6) For PC-MOS/386, tasks made resident with this call are subject
  2031.         to being swapped out of memory by the kernel for room to process
  2032.         other applications.  If your code needs to poll the keyboard or
  2033.         a port, you need to use a device driver instead.  PC-MOS does
  2034.         not swap device drivers.
  2035.  
  2036.  
  2037. Function  32h  Read DOS Disk Parameter Block
  2038.      Retrieve the pointer to the drive parameter block for a drive
  2039. entry   AH      32h
  2040.         DL      drive (0=default, 1=A:, etc.).
  2041. return  AL      0FFh    if drive is not valid or other error
  2042.                 00h     if drive is valid and:
  2043.         DS:BX   pointer to DOS Drive Parameter Table. Format of block:
  2044.               ┌────────┬──────┬────────────────────────────────────────
  2045.               │ Bytes  │ Type │                     Value
  2046.               ├────────┼──────┼────────────────────────────────────────
  2047.               │ 00h    │ byte │ Drive: 0=A:, 1=B:, etc.
  2048.               │ 01h    │ byte │ Unit within device driver (0, 1, 2, etc.)
  2049.               │ 02h-03h│ word │ Bytes per sector
  2050.               │ 04h    │ byte │ Sectors per cluster - 1
  2051.               │ 05h    │ byte │ Sectors per cluster as powers of 2
  2052.               │ 06h-07h│ word │ First sector containing FAT
  2053.               │ 08h    │ byte │ Number of copies of the FAT
  2054.               │ 09h-0Ah│ word │ Number of root directory entries
  2055.               │ 0Bh-0Ch│ word │ First sector of first cluster
  2056.               │ 0Dh-0Eh│ word │ Number of clusters on drive + 1
  2057.               ├────────┴──────┼────────────────────────────────────────
  2058.               │ DOS 2.x only  │
  2059.               ├────────┬──────┼────────────────────────────────────────
  2060.               │ 0Fh    │ byte │ Number of sectors for one copy of the FAT
  2061.               │ 10h-11h│ word │ Number of first sector of root directory
  2062.               │ 12h-15h│ dword│ Address of device driver header for this
  2063.               │        │      │ drive (beginning of device driver)
  2064.               │ 16h    │ byte │ Media Descriptor Byte for this drive
  2065.               │ 17h    │ byte │ 0FFh indicates block must be rebuilt
  2066.               │ 18h-1Bh│ dword│ address of next DOS Disk Block (0FFFFh
  2067.               │        │      │ means last in chain)
  2068.               │ 1Ch    │ word │ starting cluster of current dir (0 = root)
  2069.               │ 1Eh    │64byts│ ASCIIZ current directory path string
  2070.               ├────────┴──────┼────────────────────────────────────────
  2071.               │    DOS 3.x    │
  2072.               ├────────┬──────┼────────────────────────────────────────
  2073.               │ 0Fh    │ byte │ number of sectors in one FAT copy
  2074.               │ 10h    │ word │ first sector of root directory
  2075.               │ 12h    │dword │ address of device driver for this drive
  2076.               │ 16h    │ byte │ media descriptor byte for medium
  2077.               │ 17h    │ byte │ 0FFh = block must be rebuilt, 00h
  2078.               │        │      │ indicates block accessed
  2079.               │ 18h    │dword │ address of next device block, offset
  2080.               │        │      │ = 0FFFFh indicates last
  2081.               │ 1Ch    │ word │ cluster at which to start search for free
  2082.               │        │      │ space when writing
  2083.               │ 1Eh    │ word │ number of free clusters on drive, 0FFFFh
  2084.               │        │      │ unknown?
  2085.               ├────────┴──────┼────────────────────────────────────────
  2086.               │  DOS 4.0, 5.0 │  (from MS 5.0 TR)
  2087.               ├────────┬──────┼────────────────────────────────────────
  2088.               │ 0Fh    │ word │ number of sectors in one FAT copy
  2089.               │ 11h    │ word │ first sector of containing directory
  2090.               │ 13h    │dword │ address of device driver for this drive
  2091.               │ 17h    │ byte │ media descriptor byte for drive
  2092.               │ 18h    │ byte │ 0FFh = block must be rebuilt, 00h
  2093.               │        │      │ indicates block accessed
  2094.               │ 19h    │dword │ address of next device block, offset
  2095.               │        │      │  = 0FFFFh indicates last
  2096.               │ 1Dh    │ word │ last allocated cluster
  2097.               │ 1Fh    │ word │ number of free clusters on drive
  2098.               └────────┴──────┴────────────────────────────────────────
  2099. note 1) Use [BX+0Dh] to find no. of clusters (>1000h, 16-bit FAT; if
  2100.         not, 12-bit (exact dividing line is probably a little below
  2101.         1000h to allow for bad sectors, EOF markers, etc.)
  2102.      2) Short article by C.Petzold, PC Magazine  Vol.5, no.8.
  2103.      3) Some information from the article "Finding Disk Parameters" in
  2104.         the May 1986 issue of PC Tech Journal.
  2105.      4) This call is mostly supported in OS/2 1.0's DOS Compatibility
  2106.         Box.  The dword at 12h will not return the address of the next
  2107.         device driver when in the Compatibility Box.
  2108.      5) Used by CHKDSK.
  2109.  
  2110.  
  2111. Function  33h  Control-Break Check
  2112.      Get or set control-break checking at CON
  2113. entry   AH      33h
  2114.         AL      00h     see if ^C checking is active
  2115.                 01h     to set break checking
  2116.                         DL      00h     to disable break checking
  2117.                                 01h     to enable break checking
  2118.                 02h     internal, called by PRINT.COM (DOS 3.1)
  2119.                 03h     unknown
  2120.                 04h     unknown - DOS 4.0's CPSW command in CONFIG.SYS
  2121.                         calls this function
  2122.                 05h     (DOS 4.0+) get boot drive
  2123.                 06h     (DOS 5.0+) return "real" DOS version number
  2124.                         instead of number returned by SETVER/int 21h
  2125.                         fn 30h.
  2126. return  (if AL=00h)  break setting
  2127.         DL      00h     if break=off
  2128.                 01h     if break=on
  2129.  
  2130.         (if AL=05h)  boot drive
  2131.         DL      01h     A:
  2132.                 02h     B:  (etc.)
  2133.  
  2134.         (if AL=06h)  real DOS version
  2135.         BH      major version (05h=DOS5)
  2136.         BL      minor version (00h=.00)
  2137.         DH      0Bh     DOS is in ROM
  2138.                 10h     DOS is in HMA
  2139.         DL      DOS subversion number (0-7, VER/R reports as A-G)
  2140.  
  2141.         (all)
  2142.         AL      0FFh    error
  2143. note 1) This call is explicitly supported by the OS/2 1.x DOS
  2144.         Compatibility Box.
  2145.      2) When ^C checking is on, DOS checks for ^C after each DOS call.
  2146.         When off, DOS only checks after each DOS character I/O function
  2147.         from 01h to 0Ch.
  2148.  
  2149.  
  2150. Function  34h  Return INDOS Flag
  2151.      Returns ES:BX pointing to Critical Section Flag, byte indicating
  2152.      whether it is safe to interrupt DOS.
  2153. entry   AH      34h
  2154. return  ES:BX   points to 1-byte DOS "critical section flag"
  2155. note 1) If this byte is 0, it is safe to interrupt DOS.
  2156.      2) Supported OS/2 1.x Compatibility Box.
  2157.      3) For PC-MOS/386, this flag indicates whether MOS is using its
  2158.         stack or a task's stack.  If the flag is 0 it is safe to
  2159.         interrupt MOS.
  2160.  
  2161.  
  2162. Function  35h  Get Interrupt Vector
  2163.      Get interrupt vector
  2164. entry   AH      35h
  2165.         AL      interrupt number (hexadecimal)
  2166. return  ES:BX   address of interrupt vector
  2167. note 1) Use function call 25h to set the interrupt vectors.
  2168.      2) This call is explicitly supported by the OS/2 1.x DOS
  2169.         Compatibility Box.
  2170.  
  2171.  
  2172. Function  36h  Get Disk Free Space
  2173.      get information on specified drive
  2174. entry   AH      36h
  2175.         DL      drive number (0=default, 1=A:, 2=B:, etc)
  2176. return  AX      number of sectors per cluster
  2177.                 0FFFFh means drive specified in DL is invalid
  2178.         BX      number of available clusters
  2179.         CX      bytes per sector
  2180.         DX      clusters per drive
  2181. note 1) Multiply AX * CX * BX for free space on disk.
  2182.      2) Multiply AX * CX * DX for total disk space.
  2183.      3) Function 36h returns an incorrect value after an ASSIGN command.
  2184.         Prior to ASSIGN, the DX register contains 0943h on return, which
  2185.         is the free space in clusters on the HC diskette. After ASSIGN,
  2186.         even with no parameters, 0901h is returned in the DX register;
  2187.         this is an incorrect value.  Similar results occur with DD
  2188.         diskettes on a PC-XT or a PC-AT.  This occurs only when the disk
  2189.         is not the default drive.  Results are as expected when the
  2190.         drive is the default drive.  Therefore, the circumvention is to
  2191.         make the desired drive the default drive prior to issuing this
  2192.         function call.
  2193.      4) This function supercedes functions 1Bh and 1Ch.
  2194.      5) This call is explicitly supported by the OS/2 1.x DOS
  2195.         Compatibility Box.
  2196.      6) TOS: $36 GET DISK FREE SPACE.
  2197.  
  2198.  
  2199. Function  37h  SWITCHAR / AVAILDEV
  2200.  *   Get/set option marking character (is usually "/"), and device type
  2201. entry   AH      37h
  2202.         AL      00h     read switch character (returns current character
  2203.                         in DL)
  2204.                 01h     set character in DL as new switch character
  2205.     (DOS 2.x)   02h     read device availability (as set by function
  2206.                         AL=3) into DL.  A 0 means devices that devices
  2207.                         must be accessed in file I/O calls by /dev/device.
  2208.                         A non-zero value means that devices are
  2209.                         accessible at every level of the directory tree
  2210.                         (e.g., PRN is the printer and not a file PRN).
  2211.                         AL=2 to return flag in DL, AL=3 to set from DL
  2212.                         (0 = set, 1 = not set).
  2213.     (DOS 2.x)   03h     get device availability, where:
  2214.                         DL      00h     /dev/ must precede device names
  2215.                                 01h     /dev/ need not precede device
  2216.                                         names
  2217. return  DL      switch character (if AL=0 or 1)
  2218.                 device availability flag (if AL=2 or 3)
  2219.         AL      0FFh    the value in AL was not in the range 0-3
  2220. note 1) Functions 2 & 3 appear not to be implemented for DOS 3.x.
  2221.      2) It is documented on page 4.324 of the MS-DOS (version 2)
  2222.         Programmer's Utility Pack (Microsoft - published by Zenith).
  2223.      3) Works on all versions of IBM PC-DOS from 2.0 through 3.3.1.
  2224.      4) The SWITCHAR is the character used for "switches" in DOS command
  2225.         arguments (defaults to '/', as in "DIR/P"). '-' is popular to
  2226.         make a system look more like UNIX; if the SWITCHAR is anything
  2227.         other than '/', then '/' may be used instead of '\' for
  2228.         pathnames.
  2229.      5) Ignored by XCOPY, PKARC, LIST, used by PKZIP, LHARC.
  2230.      6) SWITCHAR may not be set to any character used in a filename.
  2231.         Legal filename characters vary in DOS 1.x through 6.x.
  2232.      7) In DOS 3.x you can still read the "AVAILDEV" byte with
  2233.         subfunction 02h but it always returns 0FFh even if you try to
  2234.         change it to 0 with subfunction 03h.
  2235.      8) AVAILDEV=0 means that devices must be referenced in an
  2236.         imaginary subdirectory "\dev" (similar to UNIX's /dev/*); a
  2237.         filename "PRN.DAT" can be created on disk and manipulated like
  2238.         any other.  If AVAILDEV != 0 then device names are recognized
  2239.         anywhere (this is the default): "PRN.DAT" is synonymous with
  2240.         "PRN:".
  2241.      9) These functions reportedly are not supported in the same
  2242.         fashion in various implementations of DOS.
  2243.     10) Used in DOS 3.3 by CHKDSK, BASIC, and DEBUG.
  2244.     11) SWITCHAR is not supported in the OS/2 1.x Compatibility Box.
  2245.     12) Not supported by the aftermarket 4DOS command interpreter in
  2246.         versions prior to 3.0.
  2247.     13) The MSDOS Encyclopedia reports: "XENIX used a forward slash as
  2248.         a separator, but versions 1.x of MS-DOS, borrowing from the
  2249.         tradition of DEC operating systems, already used the forward
  2250.         slash for switches on the command line, so Microsoft, at IBM's
  2251.         request, decided to use the backslash as the separator instead."
  2252.     14) SWITCHAR is not supported in MS-DOS 5.0.
  2253.  
  2254.  
  2255. Function  38h   Return Country-Dependent Information
  2256.                 (PCDOS 2.0, 2.1, MSDOS 2.00 only)
  2257. entry   AH      38h
  2258.         AL      function code  (must be 0 in DOS 2.x)
  2259.         DS:DX   pointer to 32 byte memory buffer for returned information
  2260. return  CF      set on error
  2261.                 AX      error code (02h)
  2262.         BX      country code
  2263.         DS:DX   pointer to buffer filled with country information:
  2264.           bytes 00h,01h date/time format
  2265.                         0000h   USA standard       H:M:S   M-D-Y
  2266.                         0001h   European standard  H:M:S   D/M/Y
  2267.                         0002h   Japanese standard  H:M:S   D:M:Y
  2268.                 02h     ASCIIZ string currency symbol
  2269.                 03h     byte of zeroes
  2270.                 04h     ASCIIZ string thousands separator
  2271.                 05h     byte of zeroes
  2272.                 06h     ASCIIZ string decimal separator
  2273.                 07h     byte of zeroes
  2274.        24 bytes 08h-1Fh reserved
  2275.  
  2276.  
  2277. Function  38h   Get Country-Dependent Information
  2278.                 (PCDOS 3.x+, MSDOS 2.01+)
  2279. entry   AH      38h
  2280.         AL      function code
  2281.                 00h     to get current country information
  2282.                 01h-0FEh country code to get information for, for
  2283.                         countries with codes less than 255
  2284.                 0FFh    to get country information for countries with
  2285.                         a code greater than 255
  2286.                         BX      16 bit country code if AL=0FFh
  2287.         DS:DX   pointer to the memory buffer where the data will be
  2288.                 returned
  2289.         DX      0FFFFh if setting country code rather than getting info
  2290. return  CF      0 (clear) function completed
  2291.                 1 (set) error
  2292.                         AX   error code
  2293.                              02h     invalid country code (no table
  2294.                                      for it)
  2295.         (if DX <> 0FFFFh)
  2296.         BX      country code (usually international telephone code)
  2297.         DS:DX   pointer to country data buffer
  2298.           bytes 0,1     date/time format
  2299.                         0       USA standard       H:M:S   M/D/Y
  2300.                         1       European standard  H:M:S   D/M/Y
  2301.                         2       Japanese standard  H:M:S   D:M:Y
  2302.           bytes 02h-06h ASCIIZ currency symbol
  2303.           byte  07h     ASCIIZ thousands separator
  2304.           byte  08h     byte of zeroes
  2305.           byte  09h     ASCIIZ decimal separator
  2306.           byte  0Ah     byte of zeroes
  2307.           byte  0Bh     ASCIIZ date separator
  2308.           byte  0Ch     byte of zeroes
  2309.           byte  0Dh     ASCIIZ time separator
  2310.           byte  0Eh     byte of zeroes
  2311.           byte  0Fh     currency format byte
  2312.                      bit 0      0  if currency symbol precedes the value
  2313.                                 1  if currency symbol is after the value
  2314.                          1      0  no spaces between value and currency
  2315.                                    symbol
  2316.                                 1  one space between value and currency
  2317.                                    symbol
  2318.                          2      1  if currency symbol replaces decimal
  2319.                                    point
  2320.                          3-7    not defined by Microsoft
  2321.           byte  10h     number of significant decimal digits in currency
  2322.                         (number of places to right of decimal point)
  2323.           byte  11h     time format byte
  2324.                     bit 0       0       12 hour clock
  2325.                                 1       24 hour clock
  2326.                         1-7     unknown, probably not used
  2327.           bytes 12h-15h address of case map routine (FAR CALL, AL=char
  2328.                                                      to map)
  2329.                         entry   AL  ASCII code of character to be
  2330.                                     converted to uppercase
  2331.                         return  AL  ASCII code of the uppercase input
  2332.                                     character
  2333.           byte  16h     data-list separator character
  2334.           byte  17h     zeroes
  2335.           bytes 18h-21h 5 words reserved
  2336. note 1) When an alternate keyboard handler is invoked, the keyboard
  2337.         routine is loaded into user memory starting at the lowest
  2338.         portion of available user memory.  The BIOS interrupt vector
  2339.         that services the keyboard is redirected to the memory area
  2340.         where the new routine resides.  Each new routine takes up about
  2341.         1.6K of memory and has lookup tables that return values unique
  2342.         to each language.  (KEYBxx in the DOS book)
  2343.           Once the keyboard interrupt vector is changed by the DOS
  2344.         keyboard routine, the new routine services all calls unless the
  2345.         system is returned to the US format by the ctrl-alt-F1 keystroke
  2346.         combination.  This does not change the interrupt vector back to
  2347.         the BIOS location; it merely passes the table lookup to the ROM
  2348.         locations.
  2349.      2) Ctrl-Alt-F1 will only change systems with US ROMS to the US
  2350.         layout.  Some systems are delivered with non-US keyboard
  2351.         handler routines in ROM.  (Amstrad machines)
  2352.      3) Case mapping call: the segment/offset of a FAR procedure that
  2353.         performs country-specific lower-to-upper case mapping on ASCII
  2354.         characters 80h to 0FFh.  It is called with the character to be
  2355.         mapped in AL.  If there is an uppercase code for the letter, it
  2356.         is returned in AL, if there is no code or the function was
  2357.         called with a value of less than 80h AL is returned unchanged.
  2358.      4) This call is fully implemented in MS-DOS version 2.01 and
  2359.         higher.  It is in version 2.00 but not fully implemented
  2360.         (according to Microsoft).
  2361.      5) This call is explicitly supported by the OS/2 1.x DOS
  2362.         Compatibility Box.
  2363.      6) For PC-MOS/386 native mode apps, use DS:EDX instead of DS:DX.
  2364.  
  2365.  
  2366. Function  38h   Set Country Dependent Information
  2367. entry   AH      38h
  2368.         AL      code    country code to set information for, for
  2369.                         countries with codes less than 255
  2370.                 0FFh    to set country information for countries with
  2371.                         a code greater than 255
  2372.         BX      16 bit country code if AL=0FFh
  2373.         DX      0FFFFh
  2374. return  CF      clear   successful
  2375.                 set     if error
  2376.                         AX      error code (02h)
  2377. note 1) Some country codes are:
  2378.         061     Australia       ("International English" in DOS 5.0)
  2379.         032     Belgium
  2380.         055     Brazil          (DOS 5.0)
  2381.         002     French-Canadian
  2382.         042     Czechoslovakia  (DOS 5.0)
  2383.         045     Denmark
  2384.         358     Finland
  2385.         033     France
  2386.         049     Germany  
  2387.         036     Hungary         (DOS 5.0)
  2388.         972     Israel
  2389.         039     Italy
  2390.         081     Japan
  2391.         758     Middle East
  2392.         031     Netherlands
  2393.         047     Norway
  2394.         048     Poland          (DOS 5.0)
  2395.         351     Portugal
  2396.         003     Latin America
  2397.         034     Spain
  2398.         046     Sweden
  2399.         041     Switzerland
  2400.         088     Taiwan          (MS 4.0+, but not DRDOS 5 or 6)
  2401.         044     U.K.
  2402.         001     USA
  2403.         038     Yugoslavia      (DOS 5.0)
  2404.      2) The country code is the same as the 3-digit international
  2405.         telephone code for that country.
  2406.      3) The documentation for COUNTRY= will tell you which codes are
  2407.         valid for your particular DOS version.  Different OEM
  2408.         implementations of the same DOS version may not support the
  2409.         same countries.
  2410.      4) TSL offers support for developing special country code drivers
  2411.         for PC-MOS/386.  Version 4.10 comes with:
  2412.         061     Australia
  2413.         032     Belgium
  2414.         002     French-Canadian
  2415.         045     Denmark
  2416.         358     Finland
  2417.         033     France
  2418.         049     Germany  
  2419.         972     Israel
  2420.         039     Italy
  2421.         758     Middle East
  2422.         031     Netherlands
  2423.         047     Norway
  2424.         351     Portugal
  2425.         034     Spain
  2426.         046     Sweden
  2427.         041     Switzerland
  2428.         044     U.K.
  2429.         001     USA
  2430.      5) For PC-MOS/386 native mode apps, use DS:EDX instead of DS:DX.
  2431.  
  2432.  
  2433. Function  39h   Create Subdirectory                     (MKDIR)
  2434.                 Makes a subdirectory along the indicated path
  2435. entry   AH      39h
  2436.         DS:DX   address of ASCIIZ directory pathname string
  2437. return  flag CF 0       successful
  2438.                 1       error
  2439.                         AX      error code if any  (03h, 05h)
  2440.                                         (DOS 5.0)  (02h, 03h, 05h)
  2441. note 1) The ASCIIZ string contains the drive and subdirectory.
  2442.      2) Drive may be any valid drive (not necessarily current drive).
  2443.      3) The pathname cannot exceed 64 characters.  (same with
  2444.         PC-MOS/386)
  2445.      4) This call is explicitly supported by the OS/2 1.x DOS
  2446.         Compatibility Box.
  2447.      5) The characters [, ] , =, and " may not be used in subdirectory
  2448.         names.
  2449.      6) TOS: $39 MKDIR.
  2450.      7) For DOS 3.1+ networks, the user must have Create access to the
  2451.         subdirectory.
  2452.      8) For PC-MOS/386 native mode, use DS:EDX instead of DS:DX.
  2453.  
  2454.  
  2455. Function  3Ah   Remove Subdirectory                     (RMDIR)
  2456. entry   AH      3Ah
  2457.         DS:DX   address of ASCIIZ pathname string
  2458. return  CF      clear     successful
  2459.                 set       AX      error code if any  (03h, 05h, 10h)
  2460. note 1) The ASCIIZ string contains the drive and subdirectory.
  2461.      2) Drive may be any valid drive (not necessarily current drive).
  2462.      3) The pathname cannot exceed 64 characters.
  2463.      4) This call is explicitly supported by the OS/2 1.x DOS
  2464.         Compatibility Box.
  2465.      5) TOS: $3A RMDIR.
  2466.      7) For DOS 3.1+ networks, the user must have Delete access to the
  2467.         subdirectory.
  2468.      8) For PC-MOS/386 native mode, use DS:EDX instead of DS:DX.
  2469.  
  2470.  
  2471. Function  3Bh   Change Current Directory                (CHDIR)
  2472. entry   AH      3Bh
  2473.         DS:DX   address of ASCIIZ string
  2474. return  flag CF 0       successful
  2475.                 1       error
  2476.         AX      error code if any (03h)
  2477. note 1) The pathname cannot exceed 64 characters including separators.
  2478.      2) The ASCIIZ string may contain drive and subdirectory.
  2479.      3) Drive may be any valid drive (not necessarily current drive).
  2480.         This call will not change the current logged drive.
  2481.      4) This call is explicitly supported by the OS/2 1.x DOS
  2482.         Compatibility Box.
  2483.      5) TOS: $3B CHDIR.
  2484.      6) The pathspec may not contain wildcards.
  2485.      7) For PC-MOS/386 native mode, use DS:EDX instead of DS:DX.
  2486.  
  2487.  
  2488. Function  3Ch   Create A File                           (CREAT)
  2489.                 Create a file with handle
  2490. entry   AH      3Ch
  2491.         CX      byte, attributes for file
  2492.                 00h     normal read/write
  2493.                 01h     read only
  2494.                 02h     hidden
  2495.                 04h     system
  2496.                 08h     volume label
  2497.                 20h     archive bit
  2498.         DS:DX   address of ASCIIZ filename string
  2499. return  CF      0       successful creation
  2500.                 1       error
  2501.         AX      16 bit file handle
  2502.                 or error code  (03h, 04h, 05h)
  2503. note 1) The ASCIIZ string may contain drive and subdirectory.
  2504.      2) Drive may be any valid drive (not necessarily current drive).
  2505.      3) If the volume label or subdirectory bits are set in CX, they are
  2506.         ignored.
  2507.      4) The file is opened in read/write mode
  2508.      5) If the file does not exist, it is created. If one of the same
  2509.         name exists, it is truncated to a length of 0.
  2510.      6) Good practice is to attempt to open a file with fn 3Dh and jump
  2511.         to an error routine if successful, create file if 3Dh fails.
  2512.         That way an existing file will not be truncated and overwritten.
  2513.      7) If the application will run only on DOS 3.x or higher, fn 5Bh
  2514.         should be used as it automatically creates the file if it does
  2515.         not exist, preventing problems with networks or multitaskers.
  2516.      8) This call is explicitly supported by the OS/2 1.x DOS
  2517.         Compatibility Box.
  2518.      9) TOS: $3C CREAT.
  2519.     10) For DOS 3.1+ networks, the user must have Create access to the
  2520.         subdirectory.
  2521.     11) For PC-MOS/386 native mode, use DS:EDX instead of DS:DX.
  2522.  
  2523.  
  2524. Function  3Dh   Open A File
  2525.                 Open disk file with handle
  2526. entry   AH      3Dh
  2527.         AL      access code byte
  2528. (DOS 2.x)  bits 0-2     file attribute
  2529.                         000     read only
  2530.                         001     write only
  2531.                         010     read/write (default)
  2532.                 3-7     reserved, should be set to zero
  2533. (DOS 3.x)  bits 0-2     file attribute
  2534.                         000     read only
  2535.                         001     write only
  2536.                         010     read/write (default)
  2537.                 3       reserved, should be set to zero
  2538.                 4-6     sharing mode (network)
  2539.                         000     compatibility mode       (default)
  2540.                         001     read/write access denied (exclusive)
  2541.                         010     write access denied
  2542.                         011     read access denied
  2543.                         100     full access permitted
  2544.                 7       inheritance flag
  2545.                         0       file inherited by child process
  2546.                         1       file private to child process
  2547.         DS:DX   address of ASCIIZ drive/path/filename string
  2548. return  CF set on error
  2549.                 AX      error code - MS-DOS (01h, 02h, 03h, 04h, 05h,
  2550.                                             0Ch)
  2551.                                    - DR-DOS (02h, 04h, 05h, 0Ch) and
  2552.                                             MS-DOS 5.0
  2553.         AX      16 bit DOS file handle
  2554. note 1) Opens any normal, system, or hidden file.
  2555.      2) Files that end in a colon are not opened.
  2556.      3) The read/write pointer is set at the first byte of the file and
  2557.         the record size of the file is 1 byte (the read/write pointer
  2558.         can be changed through function call 42h).  The returned file
  2559.         handle must be used for all subsequent input and output to the
  2560.         file.
  2561.      4) If the file handle was inherited from a parent process or was
  2562.         duplicated by DUP or FORCEDUP, all sharing and access
  2563.         restrictions are also inherited.
  2564.      5) A file sharing error (error 01h) causes an int 24h to execute
  2565.         with an error code of 02h.
  2566.      6) This call is explicitly supported by the OS/2 1.x DOS
  2567.         Compatibility Box.
  2568.      7) TOS: $3D OPEN.
  2569.      8) If any process opens a file that denies a level of access, all
  2570.         subsequent requests to open the file at that level of access
  2571.         will fail.
  2572.      9) Any attempt to open a file with a sharing mode that is already
  2573.         breached by an existing process will always fail.
  2574.     10) Used by APPEND in DOS 3.2,+.
  2575.     11) For PC-MOS/386 native mode, use DS:EDX instead of DS:DX.
  2576.  
  2577.  
  2578. Function  3Eh   Close A File Handle
  2579.                 Close a file and release handle for reuse
  2580. entry   AH      3Eh
  2581.         BX      file handle (generated by 3Dh)
  2582. return  flag CF clear   successful close
  2583.                 set     error
  2584.         AX      error code if error (06h)
  2585. note 1) When executed, the file is closed, the directory is updated,
  2586.         and all buffers for that file are flushed.  If the file was
  2587.         changed, the time and date stamps are changed to reflect the
  2588.         current time.
  2589.      2) If called with the handle 00000h, it will close STDIN (normally
  2590.         the keyboard).
  2591.      3) This call is explicitly supported by the OS/2 1.x DOS
  2592.         Compatibility Box.
  2593.      4) TOS: $3E CLOSE.
  2594.      5) In most versions of DOS only 15 file handles are available for
  2595.         user processes.  It is good practice to close a file handle
  2596.         when you are not using it.
  2597.      6) For DOS 3.1+ networks, all file locks must be removed before
  2598.         the file is closed.  Closing a file with active locks is
  2599.         unpredictable.
  2600.      7) Although closing a file invalidates the corresponding handle,
  2601.         DOS may reuse the handle to identify a file that is subsequently
  2602.         opened or created.  You can use int 21h/440Ah (Is File or Device
  2603.         Remote) to tell if a given handle is valid.
  2604.      
  2605.  
  2606. Function  3Fh   Read From A File Or Device
  2607.                 Read from file with handle
  2608. entry   AH      3Fh
  2609.         BX      file handle
  2610.         CX      number of bytes to read
  2611.         DS:DX   address of buffer
  2612. return  flag CF clear   successful read
  2613.                 set     error
  2614.         AX      00h     pointer was already at end of file
  2615.                      or number of bytes read
  2616.                      or error code (05h, 06h)
  2617. note 1) This function attempts to transfer the number of bytes specified
  2618.         in CX to a buffer location.  It is not guaranteed that all bytes
  2619.         will be read.
  2620.      2) If performed from STDIN (file handle 0000), the input can be
  2621.         redirected.
  2622.      3) If used to read the keyboard, it will only read to the first CR.
  2623.      4) The file pointer is incremented to the last byte read.
  2624.      5) This call is explicitly supported by the OS/2 1.x DOS
  2625.         Compatibility Box.
  2626.      6) TOS: $3F READ.
  2627.      7) If AX < CX a partial record was read.
  2628.      8) For DOS 3.1+ networks, the user must have Read access to the
  2629.         subdirectory.
  2630.     11) For PC-MOS/386 native mode, use DS:EDX and ECX instead of DS:DX
  2631.         and CX.
  2632.  
  2633.  
  2634. Function  40h   Write To A File Or Device
  2635.                 Write to file with handle
  2636. entry   AH      40h
  2637.         BX      file handle
  2638.         CX      number of bytes to write
  2639.         DS:DX   address of buffer
  2640. return  CF      clear   successful write
  2641.                 set     error
  2642.         AX      number of bytes written
  2643.                 or error code  (05h, 06h)
  2644. note 1) This call attempts to transfer the number of bytes indicated
  2645.         in CX from a buffer to a file.  If CX and AX do not match after
  2646.         the write, an error has taken place; however no error code will
  2647.         be returned for this problem.  This is usually caused by a full
  2648.         disk.
  2649.      2) If the write is performed to STDOUT (handle 0001), it may be
  2650.         redirected.
  2651.      3) To truncate the file at the current position of the file
  2652.         pointer, set the number of bytes in CX to zero before calling
  2653.         int 21h.  The pointer can be moved to any desired position with
  2654.         function 42h.
  2655.      4) This function will not write to a file or device marked
  2656.         read-only.
  2657.      5) May also be used to display strings to CON instead of fn 09h.
  2658.         This function will write CX bytes and stop; fn 09h will
  2659.         continue to write until a '$' character is found.
  2660.      6) This is the call that DOS actually uses to write to the screen
  2661.         in DOS 2.x and above.
  2662.      7) This call is explicitly supported by the OS/2 1.x DOS
  2663.         Compatibility Box.
  2664.      8) TOS: $40 WRITE.
  2665.      9) For PC-MOS/386 native mode, use DS:EDX and ECX instead of DS:DX
  2666.         and CX.
  2667.  
  2668.  
  2669. Function  41h   Delete A File From A Specified Subdirectory  (UNLINK)
  2670. entry   AH      41h
  2671.         DS:DX   pointer to ASCIIZ filespec to delete
  2672. return  CF      clear   successful
  2673.                 set     error
  2674.                 AX      error code if any  (02h, 05h)
  2675. note 1) This function will not work on a file marked read-only.
  2676.      2) Wildcards are not accepted.
  2677.      3) For deleting multiple files, function 13h is faster.
  2678.      4) This call is explicitly supported by the OS/2 1.x DOS
  2679.         Compatibility Box.
  2680.      5) TOS: $41 UNLINK.
  2681.      6) For DOS 3.1+ networks, the user must have Delete access to the
  2682.         subdirectory.
  2683.      7) For PC-MOS/386 native mode, use DS:EDX instead of DS:DX.
  2684.  
  2685.  
  2686. Function  42h   Move a File Read/Write Pointer               (LSEEK)
  2687. entry   AH      42h
  2688.         AL      method code byte
  2689.                 00h     offset from beginning of file
  2690.                 01h     offset from present location
  2691.                 02h     offset from end of file
  2692.         BX      file handle
  2693.         CX:DX   offset into file (high/low word) in bytes
  2694. return  AX:DX   new file pointer (segment/offset)
  2695.         CF      set     error
  2696.                         AX      error code (01h, 06h)
  2697.                 clear   successful move
  2698. note 1) If pointer is at end of file, reflects file size in bytes.
  2699.      2) The value in DX:AX is the absolute 32 bit byte offset from the
  2700.         beginning of the file.
  2701.      3) This call is explicitly supported by the OS/2 1.x DOS
  2702.         Compatibility Box.
  2703.      4) TOS: $42 LSEEK.
  2704.      5) File most be open.
  2705.      6) For PC-MOS/386 native mode, use ECX instead of CX.
  2706.  
  2707.  
  2708. Function   43h  Get/Set file attributes                 (CHMOD)
  2709. entry   AH      43h
  2710.         AL      00h     get file attributes
  2711.                 01h     set file attributes
  2712.                 CX      file attributes to set
  2713.                     bit 0       read only
  2714.                         1       hidden file
  2715.                         2       system file
  2716.                         3       volume label
  2717.                         4       subdirectory
  2718.                         5       written since backup (archive bit)
  2719.                         6,7     not used
  2720.                         8       shareable (Novell NetWare)
  2721.                         9-F     not used
  2722.         DS:DX   segment/offset pointer to full ASCIIZ file name
  2723. return  CF      set if error
  2724.                 AX      error code - MSDOS (01h, 02h, 03h, 05h)
  2725.                                      DRDOS (02h, 03h, 05h)
  2726.         CX      file attributes on get
  2727.                 attributes:
  2728.                 00h     normal
  2729.                 01h     read only
  2730.                 02h     hidden
  2731.                 04h     system
  2732.                 08h     volume label
  2733.                 10h     file is subdirectory
  2734.                 20h     archive
  2735. note 1) This call will not change the volume label or directory bits.
  2736.      2) Any combination of file attributes may be used.
  2737.      3) This call is explicitly supported by the OS/2 1.x DOS
  2738.         Compatibility Box.
  2739.      4) TOS: $43 CHANGE MODE (CHMOD).
  2740.      5) For DOS 3.1+ networks, the user must have Create access to the
  2741.         subdirectory.
  2742.      6) For PC-MOS/386 native mode, use DS:EDX instead of DS:DX.
  2743.  
  2744.  
  2745. Function  44h   I/O Control for Devices                 (IOCTL)
  2746.         provided with full version of DOSREF
  2747.  
  2748.  
  2749. Function  45h   Duplicate a File Handle                 (DUP)
  2750. entry   AH      45h
  2751.         BX      file handle to duplicate
  2752. return  CF      clear   AX      duplicate handle
  2753.                 set     AX      error code  (04h, 06h)
  2754. note 1) If you move the pointer of one handle with 3Fh (Read), 40h
  2755.         (Write), or 42h (Move Pointer) the pointer of the other will
  2756.         also be moved.
  2757.      2) The handle in BX must be open.
  2758.      3) This call is explicitly supported by the OS/2 1.x DOS
  2759.         Compatibility Box.
  2760.      4) TOS: $45 DUP.
  2761.      5) This call can be used to update the directory entry of a file
  2762.         without the overhead of opening and closing it.  For example,
  2763.         this call followed by fn 3Eh (Close File) with the duplicate
  2764.         file handle will cause DOS to flush its buffers and update the
  2765.         directory entry while the original file remains open in read/
  2766.         write mode.
  2767.  
  2768.  
  2769. Function  46h   Force Duplicate of a Handle          (FORCEDUP or CDUP)
  2770.                 Forces handle in CX to refer to the same file at the
  2771.                 same position as BX
  2772. entry   AH      46h
  2773.         BX      existing open file handle to duplicate
  2774.         CX      new file handle
  2775. return  CF      clear   both handles now refer to existing file
  2776.                 set     error
  2777.                 AX      error code (04h, 06h)
  2778. note 1) If CX was an open file, it is closed first.
  2779.      2) If you move the pointer of one handle with 3Fh (Read), 40h
  2780.         (Write), or 42h (Move Pointer) the pointer of the other will
  2781.         also be moved.
  2782.      3) The handle in BX must be open.
  2783.      4) This call is explicitly supported by the OS/2 1.x DOS
  2784.         Compatibility Box.
  2785.      5) TOS $46 FORCE.
  2786.      6) This call may be used for redirecting input and output.
  2787.  
  2788.  
  2789. Function  47h   Get Current Directory
  2790.                 Places full pathname of current directory/drive into
  2791.                 a buffer
  2792. entry   AH      47h
  2793.         DL      drive (0=default, 1=A:, etc.)
  2794.         DS:SI   segment/offset pointer to 64-byte buffer area
  2795. return  CF      clear   DS:DI   pointer to ASCIIZ pathname of the current
  2796.                                 directory
  2797.                 set     AX      error code (0Fh)
  2798. note 1) String does not begin with a drive identifier or a backslash.
  2799.      2) This call is explicitly supported by the OS/2 1.x DOS
  2800.         Compatibility Box.
  2801.      3) TOS: $47 GETDIR.
  2802.      4) For PC-MOS/386 native mode, use DS:ESI instead of DS:SI.
  2803.  
  2804.  
  2805. Function  48h   Allocate Memory                         (MALLOC)
  2806.                 Allocates the requested number of 16-byte paragraphs
  2807.                 of memory
  2808. entry   AH      48h
  2809.         BX      number of 16-byte paragraphs desired
  2810. return  CF      clear   AX      segment address of allocated space
  2811.                         BX      maximum number paragraphs available
  2812.                 set     AX      error code (07h, 08h)
  2813. note 1) BX indicates maximum memory available only if allocation fails.
  2814.      2) This call is explicitly supported by the OS/2 1.x DOS
  2815.         Compatibility Box.
  2816.      3) TOS: $48 MALLOC.
  2817.      4) Native-mode PC-MOS/386 applications allocate memory via MOS'
  2818.         interrupt 0D4h API function 11h.
  2819.      5) When in TopView this call is checked to ensure none of the
  2820.         addresses are outside the application's memory partition.
  2821.  
  2822.  
  2823. Function  49h   Free Allocated Memory
  2824.                 Frees specified memory blocks
  2825. entry   AH      49h
  2826.         ES      segment address of area to be freed
  2827. return  CF      clear   successful
  2828.                 set     AX      error code (07h, 09h)
  2829. note 1) This call is only valid when freeing memory obtained by
  2830.         function 48h.
  2831.      2) A program should not try to release memory not belonging to it.
  2832.      3) This call is explicitly supported by the OS/2 1.x DOS
  2833.         Compatibility Box.
  2834.      4) TOS: $49 MFREE.
  2835.      5) Native-mode PC-MOS/386 applications allocate memory via MOS'
  2836.         interrupt 0D4h API function 12h.
  2837.      6) When in TopView this call is checked to ensure none of the
  2838.         addresses are outside the application's memory partition.
  2839.  
  2840.  
  2841. Function  4Ah   Modify Allocated Memory Blocks          (SETBLOCK)
  2842.                 Expand or shrink memory for a program
  2843. entry   AH      4Ah
  2844.         BX      new size in 16 byte paragraphs
  2845.         ES      segment address of block to change
  2846. return  CF      clear   nothing
  2847.                 set     AX      error code (07h, 08h, 09h)
  2848.                     or  BX      maximum number of paragraphs available
  2849. note 1) Max number paragraphs available is returned only if the call
  2850.         fails.
  2851.      2) Memory can be expanded only if there is memory available.
  2852.      3) This call is explicitly supported by the OS/2 1.x DOS
  2853.         Compatibility Box.
  2854.      4) TOS: $4A SETBLOCK.
  2855.      5) Native-mode PC-MOS/386 applications allocate memory via MOS'
  2856.         interrupt 0D4h API function 12h.
  2857.      6) When in TopView this call is checked to ensure none of the
  2858.         addresses are outside the application's memory partition.
  2859.  
  2860.  
  2861. Function  4Bh   Load or Execute a Program                  (EXEC)
  2862. entry   AH      4Bh
  2863.         AL      00h     load and execute program.  A PSP is built for
  2864.                         the program the ctrl-break and terminate
  2865.                         addresses are set to the new PSP.
  2866.   (DOS 5.0)    *01h     load but don't execute (internal, DOS 3.x &
  2867.                         DESQview)    (see note 1)
  2868.                *02h     load but do not execute (internal,
  2869.                         DOS 2.x only)
  2870.                 03h     load overlay (do not create PSP, do not begin
  2871.                         execution)
  2872.                *04h     start async process (Euro-DOS 4.0 only)
  2873.                         (see note 12)
  2874.   (DOS 5.0)     05h     EnterExecState API (see note 17)
  2875.         DS:DX   segment/offset pointer to the ASCIIZ string with the
  2876.                 drive, path, and filename to be loaded
  2877.         ES:BX   segment/offset pointer to a parameter block for the load
  2878.                (AL=00h) word    segment address of environment string
  2879.                                 to be passed (0=use current)
  2880.                        dword    pointer to the command line to be
  2881.                                 placed at PSP+80h
  2882.                        dword    pointer to default FCB to be passed at
  2883.                                 PSP+5Ch
  2884.                        dword    pointer to default FCB to be passed at
  2885.                                 PSP+6Ch
  2886.               (*AL=01h) word    segment of environment (0 = use current)
  2887.                        dword    pointer to command line
  2888.                        dword    pointer to FCB 1
  2889.                        dword    pointer to FCB 2
  2890.          (DOS 3.x+)    dword    will hold SS:SP on return
  2891.          (DOS 3.x+)    dword    will hold program entry point (CS:IP) on
  2892.                                 return
  2893.               (*AL=02h) word    segment of environment (0 = use current)
  2894.                        dword    pointer to command line
  2895.                        dword    pointer to FCB 1
  2896.                        dword    pointer to FCB 2
  2897.                (AL=03h) word    segment address where file will be
  2898.                                 loaded
  2899.                         word    relocation factor to be applied to the
  2900.                                 image
  2901. return  CF      set     error
  2902.                         AX      error code (01h - 05h, 08h, 0Ah, 0Bh)
  2903.         CF      clear   if successful
  2904.                 for fn 00h, process ID set to new program's PSP; get
  2905.                         with function 62h
  2906.                 for fn 01h and DOS 3.x+ or DESQview, process ID set
  2907.                         to new program's PSP; get with function 62h
  2908.                 for fn 01h and DOS 2.x, new program's initial stack
  2909.                         and entry point returned in registers
  2910.                 for fn 02h, new program's initial stack and entry point
  2911.                         are returned in the registers
  2912. note 1) If you make this call with AL=1 the program will be loaded as
  2913.         if you made the call with AL=0 except that the program will not
  2914.         be executed.  Additionally, with AL=1 the stack segment and
  2915.         pointer along with the program's CS:IP entry point are returned
  2916.         to the program which made the 4B01h call.  These values are put
  2917.         in the four words at ES:BX+0Eh.  On entry to the call ES:BX
  2918.         points to the environment address, the command line and the
  2919.         two default FCBs.  This form of EXEC is used by DEBUG.COM.
  2920.      2) Application programs may invoke a secondary copy of the command
  2921.         processor (normally COMMAND.COM) by using the EXEC function.
  2922.         Your program may pass a DOS command as a parameter that the
  2923.         secondary command processor will execute as though it had been
  2924.         entered from the standard input device.
  2925.         The procedure is:
  2926.          A. Assure that adequate free memory (17k for 2.x and 3.0, 23k
  2927.             for 3.1) exists to contain the second copy of the command
  2928.             processor and the command it is to execute.  This is
  2929.             accomplished by executing function call 4Ah to shrink memory
  2930.             allocated to that of your current requirements.  Next,
  2931.             execute function call 48h with BX=0FFFFh.  This returns the
  2932.             amount of memory available.
  2933.         B. Build a parameter string for the secondary command processor
  2934.            in the form:
  2935.                          1 byte   length of parameter string
  2936.                         xx bytes  parameter string
  2937.                          1 byte   0Dh (carriage return)
  2938.            For example, the assembly language statement below would
  2939.            build the string to cause execution of the command FOO.EXE:
  2940.                               DB 19,"/C C:FOO",13
  2941.         C. Use the EXEC function call (4Bh), function value 0 to cause
  2942.            execution of the secondary copy of the command processor.
  2943.            (The drive, directory, and name of the command processor can
  2944.            be obtained from the COMSPEC variable in the DOS environment
  2945.            passed to you at PSP+2Ch.)
  2946.         D. Remember to set offset 2 of the EXEC control block to point
  2947.            to the string built above.
  2948.      3) All open files of a process are duplicated in the newly created
  2949.         process after an EXEC, except for files originally opened with
  2950.         the inheritance bit set to 1.
  2951.      4) The environment is a copy of the original command processor's
  2952.         environment.  Changes to the EXECed environment are not passed
  2953.         back to the original.  The environment is followed by a copy of
  2954.         the DS:DX filename passed to the child process.  A zero value
  2955.         will cause the child process to inherit the environment of the
  2956.         calling process.  The segment address of the environment is
  2957.         placed at offset 2Ch of the PSP of the program being invoked.
  2958.      5) This function uses the same resident part of COMMAND.COM, but
  2959.         makes a duplicate of the transient part.
  2960.      6) How EXEC knows where to return to: Basically the vector for int
  2961.         22h holds the Terminate address for the current process.  When
  2962.         a process gets started, the previous contents of int 22h get
  2963.         tucked away in the PSP for that process, then int 22h gets
  2964.         modified.  So if Process A EXECs process B, while Process B is
  2965.         running, the vector for int 22h holds the address to return to
  2966.         in Process A, while the save location in Process B's PSP holds
  2967.         the address that process A will return to when *it* terminates.
  2968.         When Process B terminates by one of the usual legal means, the
  2969.         contents of int 22h are (surmising) shoved onto the stack, the
  2970.         old terminate vector contents are copied back to int 22h vector
  2971.         from Process B's PSP, then a RETF or equivalent is executed to
  2972.         return control to process A.
  2973.      7) To load an overlay file with 4B: first, don't de-allocate the
  2974.         memory that the overlay will load into.  With the other 4Bh
  2975.         functions, the opposite is true - you have to free the memory
  2976.         first, with function 4Ah.  Second, the "segment address where
  2977.         the file will be loaded" (first item in the parameter block for
  2978.         sub-function 03) should be a paragraph boundary within your
  2979.         currently-allocated memory.  Third, if the procedures within
  2980.         the overlay are FAR procs (while they execute, CS will be
  2981.         equal to the segment address of the overlay area), the
  2982.         relocation factor should be set to zero.  On the other hand,
  2983.         if the CS register will be different from the overlay area's
  2984.         segment address, the relocation factor should be set to
  2985.         represent the difference.  You determine where in memory the
  2986.         overlay file will load by using the segment address mentioned
  2987.         above.  Overlay files are .EXEs (containing header, relocation
  2988.         table, and memory image).
  2989.      8) When function 00h returns, all registers are changed,
  2990.         including the stack.  You must resore SS, SP, and any other
  2991.         required registers.
  2992.      9) PCDOS EXEC function 3 (overlay) lives in the transient piece
  2993.         of COMMAND.COM and gets loaded when needed, thus the
  2994.         requirement for enough free space to load the EXEC loader
  2995.         (about 1.5k).  Under MS-DOS the EXEC system call lives in
  2996.         the system space.
  2997.     10) If you try to overlay an .EXE file with the high/low switch set
  2998.         to load the in the upper end of memory nothing will happen.
  2999.         The high/low switch is only for process creation, not for
  3000.         overlays.
  3001.     11) DOS 2.x destroys all registers, including SS:SP.
  3002.     12) (AL=04h) This is DOS 4.0 as released in 1987 to various
  3003.         European OEMs.  It is not related to US DOS 4.0.
  3004.     13) This call is explicitly supported by the OS/2 1.x DOS
  3005.         Compatibility Box.
  3006.     14) TOS: $4B EXEC.
  3007.     15) New with DOS 5.0.  Sets up for EXEC, including setting the DOS
  3008.         version number returned by SETVER/int 21h,fn 30h.  If DOS is
  3009.         installed in the HMA this function turns off the A20 line,
  3010.         making the HMA inaccessible.  If your program needs the HMA
  3011.         you must turn it back on before EXECing.  DOS normally turns
  3012.         the A20 line back on when called for normal system functions.
  3013.         Your program must call EXEC immediately after this subfunction.
  3014.         You may not call any DOS, BIOS, or system interrupts between
  3015.         this subfunction and loading your program.
  3016.     15) When in TopView this call is checked to ensure none of the
  3017.         addresses are outside the application's memory partition.
  3018.     16) This call is documented in the MS 5.0 TR, and in the PC-MOS/386
  3019.         TR.
  3020.     17) Some applications use their own EXEC scheme instead of calling 
  3021.         this function.  Since DOS 5 enhanced the EXEC functions these
  3022.         programs might not work, so Microsoft added a new set of 
  3023.         functions called EnterExecState.  If a self-EXECing program
  3024.         calls EnterExecState before EXECing, DOS 5 will do various
  3025.         internal fixups to keep things happy.
  3026.  
  3027.  
  3028. Function  4Ch   Terminate a Process                          (EXIT)
  3029.                 Quit with ERRORLEVEL exit code
  3030. entry   AH      4Ch
  3031.         AL      exit code in AL when called, if any, is passed to next
  3032.                 process
  3033. return  none
  3034. note 1) Control passes to DOS or calling program.
  3035.      2) Return code from AL can be retrieved by ERRORLEVEL or function
  3036.         4Dh.
  3037.      3) All files opened by this process are closed, buffers are
  3038.         flushed, memory is released, any network file region locks are
  3039.         released, and the disk directory is updated.
  3040.      4) Restores: Terminate vector from PSP:000Ah
  3041.                   Ctrl-C vector from PSP:000Eh
  3042.                   Critical Error vector from PSP:0012h
  3043.      5) This call is explicitly supported in the OS/2 1.x DOS
  3044.         Compatibility Box.
  3045.      6) TOS: $4C TERM. Returns 2-byte errorlevel to calling program
  3046.      7) Under DOS 3.1+ networks, all file locks should be removed
  3047.         before terminating the program.
  3048.  
  3049.  
  3050. Function  4Dh   Get Return Code of a Subprocess              (WAIT)
  3051.                 Get return from functions 31h and 4Dh  (ERRORLEVEL)
  3052. entry   AH      4Dh
  3053. return  AH      circumstance which caused termination
  3054.                 00h     normal termination
  3055.                 01h     control-break or control-C
  3056.                 02h     critical device error
  3057.                 03h     terminate and stay resident (function 31h)
  3058.         AL      exit code of subprogram (functions 31h or 4Ch)
  3059. note 1) The exit code is only returned once (the first time).
  3060.      2) This call is explicitly supported in the OS/2 1.x DOS
  3061.         Compatibility Box.
  3062.      3) Many programmers have wondered where DOS stores this
  3063.         information, so they might access it multiple times or set it
  3064.         directly.  This is a version-dependent area that changes with
  3065.         every release of DOS.
  3066.  
  3067.  
  3068. Function  4Eh   Find First Matching File                  (FIND FIRST)
  3069. entry   AH      4Eh
  3070.         CX      search attributes  (see function 43h)
  3071.         DS:DX   segment/offset pointer to ASCIIZ filename
  3072.                 (with attributes)
  3073. return  CF      set     AX      error code (02h, 03h, 12h)
  3074.                 clear   data block written at current DTA
  3075.                         format of block is:  (info from BIX)
  3076.   documented by Micro-  |00h     1 byte   attribute byte of search
  3077.   soft as "reserved for |01h     1 byte   drive letter for search
  3078.   DOS' use on subsquent |02h    11 bytes  the search name used
  3079.   Find Next calls"      |0Ch     2 bytes  word value of last entry
  3080.   function 4Fh          |0Fh     4 bytes  dword pointer to this DTA
  3081.                         |13h     2 bytes  word directory start
  3082.  
  3083.                         | PC-DOS 3.10 (from INTERRUP.ARC)
  3084.                         |00h     1 byte   drive letter
  3085.                         |01h-0Bh 11 bytes search template
  3086.                         |0Ch     1 byte   search attributes
  3087.  
  3088.                         | DOS 2.x (and DOS 3.x except 3.1?)
  3089.                                   (from INTERRUP.ARC)
  3090.                         |00h     1 byte   search attributes
  3091.                         |01h     1 byte   drive letter
  3092.                         |02h-0Ch 11 bytes search template
  3093.                         |0Dh-0Eh 2 bytes  entry count within directory
  3094.                         |0Fh-12h 4 bytes  reserved
  3095.                         |13h-14h 2 bytes  cluster number of parent
  3096.                                           directory
  3097.  
  3098.                          15h   1 byte   file attribute
  3099.                          16h   2 bytes  file time, bit mask:
  3100.                                         0-4     half-seconds
  3101.                                         5-10    minute
  3102.                                         11-15   hour
  3103.                          18h   2 bytes  file date, bit mask:
  3104.                                         0-4     day
  3105.                                         5-8     month
  3106.                                         9-15    years since 1980
  3107.                          1Ah   2 bytes  low word of file size
  3108.                          1Ch   2 bytes  high word of file size
  3109.                          1Eh  13 bytes  name and extension of file 
  3110.                                         found, plus 1 byte of 0s.  All
  3111.                                         blanks are removed from the name
  3112.                                         and extension, and if an
  3113.                                         extension is present it is
  3114.                                         preceded by a period.
  3115. note 1) This function does not support network operations.
  3116.      2) Wildcards are allowed in the filespec.
  3117.      3) If the attribute is zero, only ordinary files are found. If the
  3118.         volume label bit is set, only volume labels will be found.  Any
  3119.         other attribute will return that attribute and all normal files
  3120.         together.
  3121.      4) To look for everything except the volume label, set the hidden,
  3122.         system, and subdirectory bits all to 1.
  3123.      5) This call is explicitly supported in the OS/2 1.x DOS
  3124.         Compatibility Box.
  3125.      6) TOS: $4E SFIRST.
  3126.      7) There is a reported anomaly in MS-DOS 2.11.  Odd things happen
  3127.         when you give it "C:\" as a file name.  FindFirst reports it as
  3128.         a valid file and Open returns a handle.  If you read it twice
  3129.         DOS reports an FAT error and aborts.  You can demonstrate this
  3130.         by:
  3131.                 FIND "whatever" c:\    [twice]
  3132.         Int 21h/AH=044 AL=0 returns the handle as a NUL device which
  3133.         makes a certain amount of sense since C:\ is a null terminated
  3134.         string.  The programming solution is to trap 'C:\' before it's
  3135.         used.
  3136.      8) For PC-MOS/386 native mode, use DS:EDX instead of DS:DX. ES:EBX
  3137.         is a pointer to a 43-byte data area used instead of the DTA.
  3138.         Format:
  3139.                 0-20    reserved for MOS
  3140.                 21      attribute
  3141.                 22-23   time of last update
  3142.                 24-25   date of last update
  3143.                 26-29   file size in bytes
  3144.                 30-42   found filename, followed by 00h
  3145.  
  3146.  
  3147. Function  4Fh   Find Next Matching File                   (FIND NEXT)
  3148.                 Find next ASCIIZ file
  3149. entry   AH      4Fh
  3150. return  CF      clear   data block written at current DTA
  3151.                 set     AX      error code (02h, 12h)
  3152. note 1) If file found, DTA is formatted as in call 4Eh.
  3153.      2) Volume label searches using 4Eh/4Fh reportedly aren't 100%
  3154.         reliable under DOS 2.x.  The calls sometime report there's a
  3155.         volume label and point to a garbage DTA, and if the volume
  3156.         label is the only item they sometimes won't find it.  Most
  3157.         references recommend the use of the older FCB calls for dealing
  3158.         with the volume labels.
  3159.      3) This function does not support network operations.
  3160.      4) Use of this call assumes that the original filespec contained
  3161.         wildcards.
  3162.      5) This call is explicitly supported in the OS/2 1.x DOS
  3163.         Compatibility Box.
  3164.      6) TOS: $4F SNEXT.
  3165.      7) For PC-MOS/386 native mode, use DS:EDX instead of DS:DX. ES:EBX
  3166.         is a pointer to a 43-byte data area used instead of the DTA.
  3167.         Format:
  3168.                 0-20    reserved for MOS
  3169.                 21      attribute
  3170.                 22-23   time of last update
  3171.                 24-25   date of last update
  3172.                 26-29   file size in bytes
  3173.                 30-42   found filename, followed by 00h
  3174.  
  3175.  
  3176. Function  50h   "Used Internally by DOS" - Set PSP or SetPID
  3177.  *              Set new Program Segment Prefix (current Process ID)
  3178. entry   AH      50h
  3179.         BX      segment address of new PSP
  3180. return  none - swaps PSPs regarded as current by DOS
  3181. note 1) By putting the PSP segment value into BX and issuing call 50h
  3182.         DOS stores that value into a variable and uses that value
  3183.         whenever a file call is made.
  3184.      2) Note that in the PSP (or PDB) is a table of 20 (decimal) open
  3185.         file handles.  The table starts at offset 18h into the PSP.  If
  3186.         there is an 0FFh in a byte then that handle is not in use.  A
  3187.         number in one of the bytes is an index into an internal FB
  3188.         table for that handle.  For instance the byte at offset 18h is
  3189.         for handle 0, at offset 19h handle 1, etc. up to 13h.  If the
  3190.         high bit is set then the file associated by the handle is not
  3191.         shared by child processes EXEC'd with call 4Bh.
  3192.      3) Function 50h is dangerous in background operations prior to DOS
  3193.         3.x as it uses the wrong stack for saving registers.  (same as
  3194.         functions 0..0Ch in DOS 2.x).  It doesn't use stack in 3.0+, 
  3195.         so it is safe to use in later versions of DOS.
  3196.      4) Under DOS 2.x, this function cannot be invoked inside an int
  3197.         28h handler without setting the Critical Error flag.
  3198.      5) Open file information, etc. is stored in the PSP DOS views as
  3199.         current.  If a program (eg. a resident program) creates a need
  3200.         for a second PSP, then the second PSP should be set as current
  3201.         to make sure DOS closes that as opposed to the first when the
  3202.         second application finishes.
  3203.      6) See PC Mag Vol.5, No 9, p.314 for discussion, also used in
  3204.         their BCOPY.ASM utility.
  3205.      7) Used by DOS 3.3 PRINT & DEBUG, DesQview 2.01, Windows 1.03,
  3206.         SYMDEB from MASM 4.0.
  3207.      8) This call is available in the OS/2 1.x DOS Compatibility Box.
  3208.      9) DOS stores the PID in one location, but the actual address is
  3209.         version dependent.  The strategy is to find the PID and thereby
  3210.         find its address.  If you have its address, you can swap PIDs
  3211.         from the TSR pop-up code by peeking and poking.  In the
  3212.         initialization code, use function  51hto get the PID.  You
  3213.         know that DOS lives between the interrupt vectors 0:0 - 0:100
  3214.         and that PID.  Other programs might be in there, but DOS is
  3215.         too.  Search that memory for a copy of the PID.  When you find
  3216.         one, use this function to set a phony PID.  If the location
  3217.         where you found the original PID changes to the phony PID,
  3218.         you have found the address of the PID.  Don't forget to reset
  3219.         the PID with SetPID after each test.  DOS 2.0 and 2.1 maintain
  3220.         the PID in two locations, not one.
  3221.  
  3222.  
  3223. Function  51h   Get Program Segment Prefix   (GetPID)
  3224.                 Returns the PSP address of currently executing program
  3225. entry   AH      51h
  3226. return  BX      address of currently executing program (process ID)
  3227. note    format of PSP:
  3228.                 offset  size           description
  3229.                 00h   2 bytes   program exit point
  3230.                 02h     word    memory size in paragraphs
  3231.                 04h     byte    unused (0)
  3232.                 05h   5 bytes   CP/M style entry point (far call to DOS)
  3233.                 0Ah     word    terminate address (old int 22h)
  3234.                 0Ch     word    terminate segment
  3235.                 0Eh     word    break address (old int 23h)
  3236.                 10h     word    break segment
  3237.                 12h     word    error address (old int 24h)
  3238.                 14h     word    error segment
  3239.                 16h     word    parent PSP segment
  3240.                 18h  20 bytes   DOS 2.0+ open files, 0FFh = unused
  3241.                 2Ch     word    DOS 2.0+ environment segment
  3242.                 2Eh    dword    far pointer to process's SS:SP
  3243.                 32h     word    DOS 3.x+ max open files
  3244.                 34h             DOS 3.x+ open file table address
  3245.                 36h    dword    DOS 3.x+ open file table segment
  3246.                 38h 24 bytes    unused by DOS versions before 3.3
  3247.                 50h  3 bytes    DOS function dispatcher (FAR routine)
  3248.                 53h  9 bytes    unused
  3249.                 55h             FCB #1 extension
  3250.                 5Ch 16 bytes    FCB #1, filled in from first command
  3251.                                 line argument
  3252.                 6Ch 20 bytes    FCB #2, filled in from second command
  3253.                                 line argument
  3254.                 80h128 bytes    command tail / default DTA buffer
  3255. note 1) Used in DOS 2.x, 3.x uses 62h.
  3256.      2) Function 51h is dangerous in background operations prior to DOS
  3257.         3.x as it uses the wrong stack for saving registers.  (same as
  3258.         functions 0..0Ch in DOS 2.x).  Doesn't use any DOS stacks in
  3259.         DOS 3.0+.
  3260.      3) 50h and 51h might be used if you have more than one process in
  3261.         a PC.  For instance if you have a resident program that needs
  3262.         to open a file you could first call 50h to get the current ID
  3263.         and then call 50h to set the ID to your PSP.
  3264.      4) Under DOS 2.x, this function cannot be invoked inside an int
  3265.         28h handler without setting the Critical Error flag.
  3266.      5) Formerly "undocumented", now described in MS 5.0 TR.
  3267.      6) This call is available in the OS/2 1.x DOS Compatibility Box.
  3268.  
  3269.  
  3270. FUNCTION 52h - see file 52h
  3271.         provided with full version of DOSREF
  3272.  
  3273.  
  3274. Function  53h   "Used Internally by DOS" - Translate BPB
  3275.  *              Translates BPB (BIOS Parameter Block, see below) into
  3276.                 a DOS Disk Block (see function call 32h).
  3277. entry   AH      53h
  3278.         DS:SI   pointer to BPB (BIOS Parameter Block)
  3279.         ES:BP   pointer to buffer area for DOS Disk Block
  3280.                 Layout of BPB:
  3281.                 offset  size         description
  3282.                 00h-01h word  bytes per sector, get from DDB bytes
  3283.                               02h-03h.
  3284.                 02h     byte  sectors per cluster, get from (DDB byte
  3285.                               4) + 1
  3286.                 03h-04h word  reserved sectors, get from DDB bytes
  3287.                               06h-07h
  3288.                 05h     byte  number of FATs, get from DDB byte 08h
  3289.                 06h-07h word  # of root dir entries, get from DDB bytes
  3290.                               09h-0Ah
  3291.    for DOS 3.x: 08h-09h word  total number of sectors, get from:
  3292.                               ((DDB bytes 0Dh-0Eh) - 1) * (sectors per
  3293.                               cluster (BPB byte 2)) + (DDB bytes 0Bh-0Ch)
  3294.    for DOS 4.x:               set to zero if partition is larger than
  3295.                               32Mb, set dword at 15h to actual number
  3296.                               of sectors
  3297.                 0Ah     word  media descriptor byte, get from DDB byte
  3298.                               16h
  3299.                 0Bh-0Ch word  number of sectors per FAT, get from DDB
  3300.                               byte 0Fh
  3301.    for DOS 3.x: 0Dh     word  number of sectors per track
  3302.                 0Fh     word  number of heads
  3303.                 11h    dword  number of hidden sectors
  3304.                 15h 11 bytes  reserved
  3305.    for DOS 4.x: 15h    dword  total number of sectors if word at 08h
  3306.                               contains zero
  3307. return  unknown
  3308. note    This function is documented as 'SetDPB' in the Zenith MS-DOS
  3309.         3.05 TRM.
  3310.  
  3311.  
  3312. Function  54h   Get Verify Setting
  3313.                 Get verify flag status
  3314. entry   AH      54h
  3315. return  AL      00h if flag off
  3316.                 01h if flag on
  3317. note 1) Flag can be set with function 2Eh.
  3318.      2) This call is explicitly supported in the OS/2 1.x DOS
  3319.         Compatibility Box.
  3320.      3) The verify state is off by default.
  3321.  
  3322.  
  3323. Function  55h   "Used Internally by DOS" - Create "Child" PSP
  3324.  *              Create PSP: similar to function 26h (which creates a
  3325.                 new Program Segment Prefix at segment in DX) except
  3326.                 creates a "child" PSP rather than copying the existing
  3327.                 one.
  3328. entry   AH      55h
  3329.         DX      segment number at which to create new PSP.
  3330. return  unknown
  3331. note 1) This call is similar to call 26h which creates a PSP except that
  3332.         unlike call 26h the segment address of the parent process is
  3333.         obtained from the current process ID rather than from the CS
  3334.         value on the stack (from the INT 21h call).  DX has the new PSP
  3335.         value and SI contains the value to be placed into PSP:2 (top of
  3336.         memory).
  3337.      2) Function 55 is merely a substitute for function 26h.  It will
  3338.         copy the current PSP to the segment address DX with the
  3339.         addition that SI is assumed to hold the new memory top segment.
  3340.         This means that function 26h sets SI to the segment found in the
  3341.         current PSP and then calls function 55h.
  3342.  
  3343.  
  3344. Function  56h   Rename a File
  3345. entry   AH      56h
  3346.         DS:DX   pointer to ASCIIZ old pathname
  3347.         ES:DI   pointer to ASCIIZ new pathname
  3348. return  CF      clear   successful rename
  3349.                 set     AX      error code (02h, 03h, 05h, 11h)
  3350. note 1) Works with files in same logical drive only.
  3351.      2) Wildcard characters not allowed in filename.
  3352.      3) The name of a file is its full pathname.  The file's full
  3353.         pathname can be changed while leaving the actual FILENAME.EXT
  3354.         unchanged.  Changing the pathname allows the file to be
  3355.         "moved" from subdirectory to subdirectory on a logical drive
  3356.         without actually copying the file.
  3357.      4) DOS 3.x allows renaming of directories.
  3358.      5) This call is explicitly supported in the OS/2 1.x DOS
  3359.         Compatibility Box.
  3360.      6) TOS: $56 RENAME. Similar to MS-DOS 2.x.
  3361.      7) Under DOS 3.1+ networks, the user must have Read and Create
  3362.         access to the affected directories.
  3363.      8) For PC-MOS/386 native mode, use DS:EDX and ES:EDI instead of
  3364.         DS:DX and ES:DI.
  3365.  
  3366.  
  3367. Function  57h  Get/Set a File's Date and Time
  3368.                Read or modify time and date stamp on a file's directory
  3369.                entry
  3370. entry   AH      57h
  3371.         AL      function code
  3372.                 00h     Get Date and Time
  3373.                 01h     Set Date and Time
  3374.                         CX      time to be set
  3375.                         DX      date to be set
  3376.                 02h     unknown (DOS 4.0+)
  3377.                 03h     unknown
  3378.                 04h     unknown (DOS 4.0+)
  3379.         BX      file handle
  3380. return  CF      clear   CX      time of last write (if AL = 0)
  3381.                         DX      date of last write (if AL = 0)
  3382.                 set     AX      error code (01h, 06h)
  3383. note 1) Date/time formats are:
  3384.         CX bits 0Bh-0Fh hours (0-23)
  3385.                 05h-0Ah minutes (0-59)
  3386.                 00h-04h #2 sec. incr. (0-29)
  3387.         DX bits 09h-0Fh year (relative to 1980)
  3388.                 05h-08h month (0-12)
  3389.                 00h-04h day of the month (0-31)
  3390.      2) This call is explicitly supported in the OS/2 1.x DOS
  3391.         Compatibility Box.
  3392.      3) TOS: $57 GSDTOF.
  3393.  
  3394.  
  3395. Function  58h   Get/Set Allocation Strategy   (DOS 3.0+)
  3396. entry   AH      58h
  3397.         AL      00h     Get Current Strategy (see 01h)
  3398.                         Used to obtain the current allocation strategy.  
  3399.                         First Fit is the normal default.
  3400.  
  3401.                 01h     Set New Current Strategy
  3402.                         BL      new strategy
  3403.                         00h     First Fit - chooses the lowest block in
  3404.                                 memory which will fit (this is the
  3405.                                 default). (use first memory block large
  3406.                                 enough)
  3407.                         01h     Best Fit - chooses the smallest block
  3408.                                 which will fill the request.
  3409.                         02h     Last Fit - chooses the highest block
  3410.                                 which will fit.
  3411.         (DOS 5.0)       40h     FIRST_FIT_HIGHONLY - search upper memory
  3412.                                 area for the lowest available block
  3413.         (DOS 5.0)       41h     BEST_FIT_HIGHONLY -  search upper memory
  3414.                                 area for the smallest block that fits
  3415.                                 the request
  3416.         (DOS 5.0)       42h     LAST_FIT_HIGHONLY -  search upper memory
  3417.                                 area for the highest available block
  3418.         (DOS 5.0)       80h     FIRST_FIT_HIGH - search upper memory
  3419.                                 area for the lowest available block.  If
  3420.                                 no block found, load in conventional
  3421.                                 memory
  3422.         (DOS 5.0)       81h     BEST_FIT_HIGH - seach the upper memory
  3423.                                 area for the closest match to the
  3424.                                 requested size.  If no match is found,
  3425.                                 load in convenional memory.
  3426.         (DOS 5.0)       82h     LAST_FIT_HIGH - search the upper memory
  3427.                                 area for the available block at the
  3428.                                 highest address.  If no block is found,
  3429.                                 load in conventional memory.
  3430.                 02h     Get UMB Link State
  3431.                         Indicates if high DOS memory arenas are
  3432.                         currently part  of the conventional DOS memory
  3433.                         arena.
  3434.                 03h     Set UMB Link State
  3435.                         BX      00h     Unlink High DOS memory blocks
  3436.                                 01h     Link High DOS memory blocks
  3437.                         note:   Adds or removes high memory blocks from
  3438.                                 the DOS arena.  Returns an error if no
  3439.                                 high arenas exist.
  3440. return  CF      clear   successful
  3441.           (AL=00)       AX      strategy code (see 01h)  For DOS 5.0+,
  3442.           (AL=02)       AL      00h   if upper memory area is not linked
  3443.                                 01h   if the upper memory area is linked
  3444.                 set     error
  3445.                         AX      error code (01h)
  3446.           (AL=03)       AX      0001h   invalid function if DOS was 
  3447.                                         loaded without DOS=UMB
  3448.                                 0007h   memory arena trashed
  3449. note 1) A program that changes the allocation strategy or the high DOS
  3450.         link state should ALWAYS restore it to its original condition
  3451.         before exiting, or subsequent programs may fail.
  3452.      2) The set subfunction accepts any value in BL; 2 or greater means
  3453.         last fit.  The get subfunction returns the last value set, so
  3454.         programs should check whether the value is greater than or equal
  3455.         to 2.
  3456.      3) For discussion of best fit vs. first fit allocation strategies,
  3457.         see Knuth, *Fundamental Algorithms.*  Very briefly, Knuth finds
  3458.         that first fit methods are far superior to best fit, which
  3459.         increases both allocation overhead and memory fragmentation.
  3460.         The "last" fit that DOS offers is nothing other than a first
  3461.         fit, starting the search at the other end of the chain (the
  3462.         algorithm still takes the first fitting block that is
  3463.         encountered in the search).
  3464.      4) For DOS 5+, the default scheme is "allocate high first".  This 
  3465.         is actually a variant of the previous first/best/last 
  3466.         allocation options.  When enabled, the high-first strategy
  3467.         causes DOS to begin its free block search at the first UMB. If
  3468.         DOS can't find enough memory in the UMB, it searches from the
  3469.         beginning of conventional memory.  As a result, high-first may
  3470.         result in a worse fit than best fit alone if there is a better
  3471.         fit low than high.
  3472.  
  3473.  
  3474. Function  59h   Get Extended Error Code (DOS 3.0+)
  3475.        The Get Extended Error function call (59h) is intended to provide
  3476.      a common set of error codes and to supply more extensive
  3477.      information about the error to the application.  The information
  3478.      returned from function call 59h, in addition to the error code,
  3479.      is the error class, the locus, and the recommended action.  The
  3480.      error class provides information about the error type (hardware,
  3481.      internal, system, etc.).  The locus provides information about
  3482.      the area involved in the failure (serial device, block device,
  3483.      network, or memory).  The recommended action provides a default
  3484.      action for programs that do not understand the specific error code.
  3485.  
  3486.        Newly written programs should use the extended error support
  3487.      both from interrupt 24h hard error handlers and after any int
  3488.      21h function calls.  FCB function calls report an error by
  3489.      returning 0FFh in AL.  Handle function calls report an error by
  3490.      setting the carry flag and returning the error code in AX.  Int
  3491.      21h handle function calls for DOS 2.x continue to return error
  3492.      codes 0-18.  Int 24h handle function calls continue to return
  3493.      error codes 0-12.  But the application can obtain any of the
  3494.      error codes used in the extended error codes table by issuing
  3495.      function call 59h.  Handle function calls for DOS 3.x can return
  3496.      any of the error codes.  However, it is recommended that the
  3497.      function call be followed by function call 59h to obtain the
  3498.      error class, the locus, and the recommended action.
  3499.  
  3500.        The Get Extended Error function (59h) can always be called,
  3501.      regardless of whether the previous DOS call was old style (error
  3502.      code in AL) or new style (carry bit).  It can also be used inside
  3503.      an int 24h handler.
  3504.  
  3505.        You can either check AL or the carry bit to see if there was no
  3506.      error, and call function 59h only if there was an error, or take
  3507.      the simple approach of always calling 59h and letting it tell you
  3508.      if there was an error or not.  When you call function 59h it will
  3509.      return with AX=0 if the previous DOS call was successful.
  3510.  
  3511.        Various versions of IBM's DOS, MSDOS, OEM customized versions
  3512.      of MSDOS, Digital's DRDOS, and other DOS emulating environments
  3513.      sometimes return different error codes for the same function.
  3514.      Be careful if you are testing for one specific error condition.
  3515.  
  3516. entry   AH      59h
  3517.         BX      version code (0000 for DOS 3.0 and 3.1)
  3518. return  AX      extended error code:
  3519.                 01h     Invalid function number                     2.0+    
  3520.                 02h     File not found                              2.0+    
  3521.                 03h     Path not found                              2.0+    
  3522.                 04h     Too many open files, no file handles left   2.0+    
  3523.                 05h     Access denied                               2.0+    
  3524.                 06h     Invalid handle                              2.0+    
  3525.                 07h     Memory control blocks destroyed             2.0+    
  3526.                 08h     Insufficient memory                         2.0+    
  3527.                 09h     Invalid memory block address                2.0+    
  3528.                 0Ah     Invalid environment                         2.0+    
  3529.                 0Bh     Invalid format                              2.0+    
  3530.                 0Ch     Invalid access code                         2.0+    
  3531.                 0Dh     Invalid data                                2.0+    
  3532.                 0Eh     Reserved                                    2.0+    
  3533.                 0Fh     Invalid drive was specified                 2.0+    
  3534.                 10h     Attempt to remove the current directory     2.0+    
  3535.                 11h     Not same device                             2.0+    
  3536.                 12h     No more files                               2.0+    
  3537.                 13h     Tried to access write-protected diskette    2.0+    
  3538.                 14h     Unknown unit                                2.0+    
  3539.                 15h     Drive not ready                             2.0+    
  3540.                 16h     Unknown command                             2.0+    
  3541.                 17h     Bad CRC check                               2.0+    
  3542.                 18h     Bad request structure length                2.0+    
  3543.                 19h     Seek error                                  2.0+    
  3544.                 1Ah     Unknown media type                          2.0+    
  3545.                 1Bh     Sector not found                            2.0+    
  3546.                 1Ch     Printer out of paper                        2.0+    
  3547.                 1Dh     Write fault                                 2.0+    
  3548.                 1Eh     Read fault                                  2.0+    
  3549.                 1Fh     General failure                             2.0+    
  3550.                 20h     Sharing violation                           3.0+    
  3551.                 21h     Lock violation                              3.0+    
  3552.                 22h     Invalid disk change                         3.0+    
  3553.                 23h     FCB unavailable                             3.0+    
  3554.                 24h     Sharing buffer overflow                     3.3+    
  3555.                 25h     Bad code page                               4.0+    
  3556.                 26h     Handle EOF                                  4.0+    
  3557.                 27h     Handle disk full                            4.0+    
  3558.                 28h     Reserved
  3559.                 29h        "
  3560.                 2Ah        "
  3561.                 2Bh        "
  3562.                 2Ch        "
  3563.                 2Dh        "
  3564.                 2Eh        "
  3565.                 2Fh        "
  3566.                 30h        "
  3567.                 31h     Reserved
  3568.                 32h     Network: request not supported              3.1+    
  3569.                 33h     Network: remote computer not listening      3.1+    
  3570.                 34h     Network: duplicate name on network          3.3+    
  3571.                 35h     Network: name not found                     3.3+    
  3572.                 36h     Network: busy                               3.3+    
  3573.                 37h     Network: device no longer exists            3.3+    
  3574.                 38h     Network: NETBIOS command limit exceeded     3.3+    
  3575.                 39h     Network: adapter hardware error             3.3+    
  3576.                 3Ah     Network: incorrect response from network    3.3+    
  3577.                 3Bh     Network: unexpected network error           3.3+    
  3578.                 3Ch     Network: incompatible remote adapter        3.3+    
  3579.                 3Dh     Network: print queue full                   3.3+    
  3580.                 3Eh     Network: not enough space for print file    3.3+    
  3581.                 3Fh     Network: print file was deleted             3.3+    
  3582.                 40h     Network: name was deleted                   3.3+    
  3583.                 41h     Network: access denied                      3.3+    
  3584.                 42h     Network: device type incorrect              3.3+    
  3585.                 43h     Network: name not found                     3.3+    
  3586.                 44h     Network: name limit exceeded                3.3+    
  3587.                 45h     Network: NETBIOS session limit exceeded     3.3+    
  3588.                 46h     Network: sharing temporarily paused         3.3+    
  3589.                 47h     Network: request not accepted               3.3+    
  3590.                 48h     Network: print or disk redirection paused   3.1+    
  3591.                 49h     Reserved
  3592.                 4Ah        "
  3593.                 4Bh        "
  3594.                 4Ch        "
  3595.                 4Dh        "
  3596.                 4Eh        "
  3597.                 4Fh     Reserved
  3598.                 50h     File exists                                 3.3+    
  3599.                 51h     Reserved                                    3.3+    
  3600.                 52h     Cannot make directory entry                 4.0+    
  3601.                 53h     Fail on interrupt 24h                       3.3+    
  3602.                 54h     Network: too many redirections              3.3+    
  3603.                 55h     Network: duplicate redirection              3.3+    
  3604.                 56h     Invalid password                            3.3+    
  3605.                 57h     Invalid parameter                           3.3+    
  3606.                 58h     Network: data fault (write error)           3.3+    
  3607.                 59h     Reserved                                            
  3608.                 5Ah     Comp not loaded                             5.0+    
  3609.         BH      class of error:                          (DOS 5.0 name)
  3610.                 01h     Out of resource                 ERRCLASS_OUTRES
  3611.                         (not enough disk space, etc)
  3612.                 02h     Temporary situation             ERRCLASS_TEMPSIT
  3613.                         (not an error, but a temporary situation that is
  3614.                          expected to end, such as a locked region in a
  3615.                          file)
  3616.                 03h     Authorization                   ERRCLASS_AUTH
  3617.                         (denied access - sharing or network)
  3618.                 04h     Internal                        ERRCLASS_INTRN
  3619.                         (DOS internal error)
  3620.                 05h     Hardware failure                ERRCLASS_HRDFAIL
  3621.                         (bad floppy or HD controller, etc.)
  3622.                 06h     System failure                  ERRCLASS_SYSFAIL
  3623.                         (error not due to executing program, such as
  3624.                          missing configuration or data files)
  3625.                 07h     Application program error       ERRCLASS_APPERR
  3626.                         (executing program bombed)
  3627.                 08h     Not found                       ERRCLASS_NOTFND
  3628.                         (file or device not found)
  3629.                 09h     Bad format                      ERRCLASS_BADFMT
  3630.                         (file or item invalid format or type)
  3631.                 0Ah     Locked                          ERRCLASS_LOCKED
  3632.                         (network or SHARE lock)
  3633.                 0Bh     Media error                     ERRCLASS_MEDIA
  3634.                         (wrong volume ID, disk failure)
  3635.                 0Ch     Already exists                  ERRCLASS_ALREADY
  3636.                         (file or device already exists)
  3637.                 0Dh     Unknown                         ERRCLASS_UNK
  3638.                         (Smurfs infesting system board)
  3639.         BL      suggested action code:
  3640.                 01h     Retry                           ERRACT_RETRY
  3641.                 02h     Delayed retry                   ERRACT_DLYRET
  3642.                 03h     Prompt user                     ERRACT_USER
  3643.                 04h     Abort after cleanup             ERRACT_ABORT
  3644.                 05h     Immediate abort                 ERRACT_PANIC
  3645.                 06h     Ignore                          ERRACT_IGNORE
  3646.                 07h     Retry after user intervention   ERRACT_INTRET
  3647.         CH      locus (where error occurred):
  3648.                 01h     Unknown or not appropriate      ERRLOC_UNK
  3649.                 02h     Block device                    ERRLOC_DISK
  3650.                 03h     Network related                 ERRLOC_NET
  3651.                 04h     Serial device                   ERRLOC_SERDEV
  3652.                 05h     Memory related                  ERRLOC_MEM
  3653. note 1) Not all DOS functions use the carry flag to indicate an error.
  3654.         Carry should be tested only on those functions which are
  3655.         documented to use it.
  3656.      2) None of the DOS functions which existed before 2.0 use the
  3657.         carry indicator.  Many of them use register AL as an error
  3658.         indication instead, usually by putting 0FFh in AL on an error.
  3659.         Most, but not all, the "new" (2.x, 3.x) functions do use carry,
  3660.        and most, but not all, of the "old" (1.x) functions use AL.
  3661.      3) On return, CL, DI, DS, DX, ES, BP, and SI are destroyed - save
  3662.         before calling this function if required.
  3663.      4) DOS 2.x Error Codes:  If you are using function calls 38h-57h
  3664.         with DOS 2.x, to check if an error has occurred, check for the
  3665.         following error codes in the AX register:
  3666.         call| error code    call| error code     call| error code
  3667.         ----|-------------------|--------------------|----------------
  3668.         38h | 2             41h | 2,3,5          4Ah | 7,8,9
  3669.         39h | 3,5           42h | 1,6            4Bh | 1,2,3,5,8,10,11
  3670.         3Ah | 3,5,15        43h | 1,2,3,5        4Eh | 2,3,18
  3671.         3Bh | 3             44h | 1,3,5,6        4Fh | 18
  3672.         3Ch | 3,4,5         45h | 4,6            56h | 2,3,5,17
  3673.         3Dh | 2,3,4,5,12    46h | 4,6            57h | 1,6
  3674.         3Eh | 6             47h | 15
  3675.         3Fh | 5,6           48h | 7,8
  3676.         40h | 5,6           49h | 7,9
  3677.      5) Note that extended error codes 13h through 1Fh correspond to
  3678.         error codes 00h through 0Ch returned by int 24h.
  3679.      6) This call is explicitly supported in the OS/2 1.x DOS
  3680.         Compatibility Box.
  3681.  
  3682.  
  3683. Function  5Ah   Create Temporary File
  3684.                 Create unique filename (for temporary use) (DOS 3.0+)
  3685. entry   AH      5Ah
  3686.         DS:DX   pointer to buffer containing an ASCIIZ directory
  3687.                 pathname ending with a backslash (\).  The buffer must
  3688.                 have at least 13 bytes free following the backslash,
  3689.                 as the file name and extension will be written there.
  3690.         CX      file attribute (00h, 01h, 02h, 04h, 20h only)
  3691. return  CF      clear   AX      handle
  3692.                         DS:DX   new ASCIIZ pathname
  3693.                 set     AX      error code (03h, 04h, 05h)
  3694. note 1) The file created is not truly "temporary".  It must be removed
  3695.         by the user.
  3696.      2) If the filename created already exists in the current
  3697.         directory, this function will call itself again with another
  3698.         unique filename until a truly unique filename is found.
  3699.      3) The temporary filename usually consists of mixed letters and
  3700.         numbers.  No file extension appears to be generated.
  3701.      4) DOS 3.0-4.01 used mixed letters and numbers.  MS DOS 5.0 appears
  3702.         to use letters only.  DR DOS 5.0 appears to use numbers only.
  3703.      5) Under DOS 3.1+ and NETBIOS compatible networks, DOS opens the 
  3704.         file in compatibility mode.
  3705.      6) This call is explicitly supported in the OS/2 1.x DOS
  3706.         Compatibility Box.
  3707.      7) For PC-MOS/386 native mode, use DS:EDX instead of DS:DX.
  3708.  
  3709.  
  3710. Function  5Bh   Create a New File   (DOS 3.0+)
  3711. entry   AH      5Bh
  3712.         DS:DX   segment/offset pointer to an ASCIIZ pathname
  3713.         CX      file attribute (00h, 01h, 02h, 04h, 20h only)
  3714. return  CF      clear   AX      file handle
  3715.                         DS:DX   new ASCIIZ pathname
  3716.                 set     AX      error code (03h, 04h, 05h, 50h)
  3717. note 1) Unlike function 3Ch, function 5Bh will fail if the file already
  3718.         exists.  This is useful on networks, since another application
  3719.         might create a file of the same name with 3Ch first, causing
  3720.         the first 3Ch to fail.  Use of this call instead of 3Ch is good
  3721.         practice for code that will not need to run under DOS 2.x.
  3722.      2) Under DOS 3.1+ networks, DOS opens the file in read/write mode.
  3723.         This call will fail if the user does not have Create access.
  3724.      3) This call is explicitly supported in the OS/2 1.x DOS
  3725.         Compatibility Box.
  3726.      4) The MSDOS Encyclopedia suggests this call may be used to
  3727.         implement semaphores in LANs or multitasking environments.  A
  3728.         zero-byte marker file could be created to indicate semaphore set.
  3729.      5) For PC-MOS/386 native mode, use DS:EDX instead of DS:DX.
  3730.  
  3731.  
  3732. Function  5Ch   Lock/Unlock File Access   (DOS 3.0+)
  3733. entry   AH      5Ch
  3734.         AL      00h     to lock file region
  3735.                 01h     to unlock file region
  3736.         BX      file handle
  3737.         CX:DX   4-byte starting offset from beginning of file of region
  3738.                 to lock
  3739.         SI:DI   4-byte integer, high/low size of region to lock
  3740.                 (in bytes)
  3741. return  CF      clear   successful
  3742.                 set     AX      error code (01h, 06h, 21h, 24h)
  3743. note 1) Unlock all files before exiting or undefined results may occur.
  3744.         Programs using file locking should trap int 23h (Control-C
  3745.         Handler Address) and int 24h (Critical Error Handler Address)
  3746.         and unlock files before returning to the caller.
  3747.      2) Programs spawned with EXEC inherit all the parent's file
  3748.         handles but not the file locks.
  3749.      3) This call is explicitly supported in the OS/2 1.x DOS
  3750.         Compatibility Box.
  3751.      4) You may lock an entire file, any part of a file, or several
  3752.         parts of the same file.  For example, it would be more
  3753.         efficient to lock an area in a database containing a single
  3754.         record than to lock the entire file.  If two adjacent sections
  3755.         of a file are locked separately, they  must be unlocked
  3756.         separately - you cannot change the lock pointers and use a
  3757.         single unlock call.
  3758.      5) You should lock only as much of a file as you need and keep
  3759.         the lock only for as long as necessary.  Should a file need to
  3760.         be shared and updated often, continual locking and unlocking
  3761.         can slow file access detectably.
  3762.      6) This call returns error 01h if SHARE is not loaded.
  3763.      7) Locked files must be unlocked before the program terminates,
  3764.         or the result is undefined.
  3765.      8) A transaction-oriented algorithm for using locking is
  3766.         recommended.  In effect, assert lock, read data, change data,
  3767.         remove lock.  An application should release its lock when a
  3768.         transaction is complete.
  3769.      9) Locking past end-of-file does not cause an error.
  3770.     10) Locking a portion of a file with fn 5Ch denies all other
  3771.         processes both read and write access to the locked region.
  3772.     11) For PC-MOS/386 native mode, use ECX and EDX instead of CX:DX.
  3773.  
  3774.  
  3775. Function  5Dh   Multifunction, DOS  Internal - partial (DOS 3.x+)
  3776. entry   AH      5Dh
  3777.         AL      subfunction
  3778.                 00h     Indirect Function Call
  3779.                         DS:DX   pointer to buffer containing register
  3780.                                 values AX, BX, CX, DX, SI, DI, DS, ES
  3781.                                 for a call to int 21h
  3782.                         return  as appropriate for function being called
  3783.                         note    Does not check AH.  Out of range values
  3784.                                 will crash the system.
  3785.                 01h     SYNC?  (DOS 3.1+)
  3786.                         parameters unknown
  3787.                         note 1) Does something to each disk file in the
  3788.                                 system.  File Table which has been
  3789.                                 written to.
  3790.                              2) If remote file, calls int 2Fh/fn1107h.
  3791.                              3) Seems to update the time stamp of all
  3792.                                 open files which have been written to.
  3793.                 02h     SHARE.EXE? (DOS 3.1+)
  3794.                         note    Error unless SHARE is loaded
  3795.                                 (calls fn 52h+4Ah)
  3796.                 03h     SHARE.EXE? (DOS 3.1+)
  3797.                         note    Error unless SHARE is loaded
  3798.                                 (calls fn 52h+4Ah)
  3799.                 04h     SHARE.EXE functions? (DOS 3.1+)
  3800.                         note    Error unless SHARE is loaded
  3801.                                 (calls fn 52h+4Ah)
  3802.                 05h     Network functions? (DOS 3.1+)
  3803.                         DS:DX   pointer to buffer (see AX=0Ah), only
  3804.                                 fields at offset 12h, 14h used
  3805.                         note    Error unless SHARE is loaded
  3806.                                 (calls fn 52h+5Ah)
  3807.                 06h     Get Address of Critical Error Flag
  3808.                         DS:DX   pointer to buffer (see 0Ah), only
  3809.                                 fields at offset 12h, 14h used
  3810.                         return  CX      unknown value
  3811.                                 DX      unknown value
  3812.                                 DS:SI   pointer to critical error flag
  3813.                         notes   This call does a lot of other work in
  3814.                                 addition to returning the pointer.
  3815.                                 Setting the CritErr flag allows use of
  3816.                                 functions 50h/51h from int 28h under
  3817.                                 DOS 2.x by forcing use of correct stack.
  3818.     (LANtastic) 07h     Return Redirected Printer mode
  3819.                         return  DL      00      output is combined
  3820.                                         01h     output is separated
  3821.                         note    The current printer mode (either
  3822.                                 printer output combined or separated)
  3823.                                 is returned.
  3824.     (LANtastic) 08h     Set Redirected Printer Mode
  3825.                         DL      00h     set redirected output to be
  3826.                                         combined
  3827.                                 01h     set redirected output to be
  3828.                                         separated.  (implicitly starts
  3829.                                         a new print job)
  3830.                         return  none
  3831.                         note 1) The current printer mode (either printer
  3832.                                 output combined or separated) can be set.
  3833.                              2) may be used by COMMAND.COM
  3834.     (LANtastic) 09h     Flush Printer Output
  3835.                         return  none
  3836.                         note 1) Printer output is flushed and a new
  3837.                                 print job is started.  If no output
  3838.                                 exists to be flushed then this function
  3839.                                 has no effect.
  3840.                              2) may be used by COMMAND.COM
  3841.                 09h     unknown - may be used by COMMAND.COM
  3842. (DOS 5, doc'd)  0Ah     Set Extended Error Information
  3843.                         DS:DX   address of 11-word error information 
  3844.                                 table:
  3845.                                 format of error information table:
  3846.                                 offset  size    description
  3847.                                 00h    word    value that next call to
  3848.                                                fn 59h  will return in AX
  3849.                                 02h    word    value that next call to
  3850.                                                fn 59h will return in BX
  3851.                                 04h    word    CX
  3852.                                 06h    word    DX
  3853.                                 08h    word    SI
  3854.                                 0Ah    word    DI
  3855.                                 0Ch    word    DS
  3856.                                 0Eh    word    ES
  3857.                                 10h    word    reserved (set to 0)
  3858.                                 12h    word    user (computer) ID,
  3859.                                                0=local
  3860.                                 14h    word    program ID, 0=local
  3861.                                                program
  3862.                 return  none
  3863. return   DS:SI   (for 06h) pointer to critical error flag
  3864. note 1) Function 0Ah; DOS 3.1+.
  3865.      2) Function 06h; setting CritErr flag allows use of functions
  3866.         50h/51h from int 28h under DOS 2.x by forcing the use of the
  3867.         correct stack.
  3868.      3) Functions 07h, 08h, 09h are identical in DOS 3.1 and call int
  3869.         2Fh fn 1125h.
  3870.  
  3871.  
  3872. Function  5Eh   Network Printer
  3873.                 DOS 3.1+ with Networks software
  3874.                 PC-MOS/386 through 4.1 has limited support for functions
  3875.                 5Eh through 5F04h.  The MOS NETBIOS driver must be
  3876.                 loaded.  A device name is returned for 5E00h and an
  3877.                 "end of list" status is returned for other functions.
  3878. entry   AH      5Eh
  3879.         AL      00h     Get Machine Name
  3880.                         DS:DX   pointer to 16-byte buffer for ASCIIZ name
  3881.                         return  CH      00h     if name not defined
  3882.                                         <>0     name is defined
  3883.                                 CL      00h     name not set
  3884.                                         <>0     NetBIOS name number
  3885.                                 DS:DX   pointer to ASCIIZ name if CH <>0
  3886.                                 CF      set on error
  3887.                                         AX      error code (01h)
  3888.                         note 1) The ASCIIZ name is a 15 byte string
  3889.                                 padded to length with zeroes.
  3890.                              2) The NETBIOS number in CL and name at
  3891.                                 DS:DX are valid only if the value
  3892.                                 returned in CH is <>0.
  3893.                 01h     Set Machine Name
  3894.                         CH      00h     undefine name
  3895.                                 <>0     define name
  3896.                         CL      name number
  3897.                         DS:DX   pointer to ASCIIZ name
  3898.                 02h     Set Printer Control String
  3899.                         BX      redirection list index
  3900.                         CX      length of setup string (max 64 bytes)
  3901.                         DS:SI   pointer to ASCIIZ setup string buffer
  3902.                         return: CF      set on error
  3903.                                         AX      error code (01h)
  3904.                         note 1) Set printer setup sets a setup string
  3905.                                 to be sent to the network printer
  3906.                                 whenever a file is queued to the
  3907.                                 printer.
  3908.                              2) LANtastic LANOS does not process this
  3909.                                 request since printer setup strings are
  3910.                                 controlled by the system administrator
  3911.                                 using the NET_MGR program.  The system
  3912.                                 call does not return an error, however.
  3913.                 03h     Get Printer Control String
  3914.                         BX      redirection list index
  3915.                         ES:DI   pointer to 64-byte string buffer
  3916.                         return  CX      length of setup string
  3917.                                         (maximum 64 bytes)
  3918.                         return: CF      set on error
  3919.                                         AX      error code (01h)
  3920.                         note 1) This call will return the setup string
  3921.                                 set with fn 02h above.
  3922.                              2) LANtastic LANOS does not process this
  3923.                                 request since printer setup strings are
  3924.                                 controlled by the system administer
  3925.                                 using the NET_MGR program.  The system
  3926.                                 call does not return an error, however,
  3927.                                 and the length of the setup string (CX)
  3928.                                 is 0.
  3929.                 04h     DOS 3.1+ +Microsoft Networks - unknown
  3930.                         note    Calls int 2F/AX=111Fh with 5E04h on
  3931.                                 stack.
  3932.                 05h     DOS 3.1+ +Microsoft Networks - unknown
  3933.                         note    Calls int 2F/AX=111Fh with 5E05h on
  3934.                                 stack.
  3935.                 06h     DOS 3.1+ +Microsoft Networks - unknown
  3936.                         note    Calls int 2F/AX=111Fh with 5E06h on
  3937.                                 stack.
  3938. return  CF      clear   successful
  3939.                 set     error
  3940.                         AX      error code (01h for all listed subfns)
  3941. note 1) Used in IBM's & Microsoft's Network programs.
  3942.      2) Partial documentation in Fall 1985 Byte, in Advanced MS-DOS,
  3943.         in MS-DOS Encyclopedia, LANtastic Programmer's Manual.  
  3944.      3) These services require that the network software be installed.
  3945.      4) SHARE must be loaded or results can be unpredictable on 00h,
  3946.         or fail with 02h or 03h.
  3947.      5) The redirection entry index is an index into a table that
  3948.         identifies the printer as a device on the network.
  3949.  
  3950.  
  3951. Function  5Fh   Network Redirection
  3952.                 (DOS 3.1+ and Microsoft Networks)
  3953. entry   AH      5Fh
  3954.         AL     *00h     Unknown
  3955.                *01h     Unknown
  3956.                 02h     Get Redirection List Entry
  3957.                         BX      redirection entry index.  Index 0
  3958.                                 specifies the first entry
  3959.                         DS:SI   pointer to 16 byte area which will
  3960.                                 receive the ASCIIZ local device name
  3961.                         ES:DI   pointer to 128 byte buffer for the
  3962.                                 ASCIIZ network device name
  3963.                         return  CF      set on error
  3964.                                         AX      error code (01h, 12h)
  3965.                                 BH      device status flag
  3966.                                         (bit 0=0 if valid)
  3967.                                         (bit 0=1 if invalid)
  3968.                                         (bits 1-7 reserved)
  3969.                                 BL      device type
  3970.                                         03      printer device
  3971.                                         04      drive device (file)
  3972.                                 CX      value stored by fn 03h call.
  3973.                                         Should be 0 for compatiblity
  3974.                                         with LAN OS
  3975.                                 DS:SI   pointer to 16 byte ASCIIZ local
  3976.                                         device name
  3977.                                 ES:DI   pointer to 128 byte ASCIIZ
  3978.                                         network name
  3979.                         note 1) DX and BP are destroyed by this call.
  3980.                              2) This call returns information about a
  3981.                                 single redirected device (see fn 03h).
  3982.                                 This fn may be used to scan the list of
  3983.                                 redirected devices.
  3984.                 03h     Redirect Device - Make Assign List Entry
  3985.                         Redirects a workstation drive or device to a
  3986.                         server directory or device.
  3987.                         AX      error code if error
  3988.                         BL      device type
  3989.                                 03h     printer device
  3990.                                 04h     file device
  3991.                         CX      stored parameter value (0 for
  3992.                                 compatibility with IBM PC Network
  3993.                                 program and LANtastic)
  3994.                         DS:SI   pointer to 16-byte ASCIIZ source
  3995.                                 device name for printer: PRN, LPT1,
  3996.                                 LPT2, LPT3
  3997.                         ES:DI   pointer to destination 128-byte
  3998.                                 ASCIIZ network path and ASCIIZ
  3999.                                 password  (e.g.,'\\machine_name\path',
  4000.                                 0,'password',0)
  4001.                         return  CF      set on error
  4002.                                         AX      error code (01h, 03h,
  4003.                                                 05h, 08h, 0Fh, 12h)
  4004.                         note 1) Redirect device allows you to connect
  4005.                                 local devices to network paths.  For
  4006.                                 example you can connect your LPT1 to
  4007.                                 a printer on another node.  References
  4008.                                 to LPT1 are routed to the network.
  4009.                              2) If the password is omitted, the
  4010.                                 pathname must be followed by two null
  4011.                                 bytes.
  4012.                              3) For printer redirection, MS-Network
  4013.                                 intercepts int 17h.  When redirection
  4014.                                 is canceled, all printing is sent to
  4015.                                 the first local printer. (LPT1)
  4016.                 04h     Cancel Redirection Assignment
  4017.                         DS:SI   pointer to ASCIIZ device name or
  4018.                                 network path to be canceled
  4019.                         return  CF      set on error
  4020.                                         AX      error code (01h, 03h,
  4021.                                                 05h, 08h, 0Fh, 12h)
  4022.                         note 1) Cancel device redirection allows you
  4023.                                 to remove a device redirection so that
  4024.                                 the device is restored to its former
  4025.                                 state.
  4026. return  CF      clear   successful
  4027.                 set     if error
  4028.                         AX      error code
  4029.                                 (fn 02h) 01h, 12h
  4030.                                 (fn 03h) 01h, 03h, 05h, 08h
  4031.                                 (fn 04h) 01h, 0Fh
  4032. note 1) Used in IBM's Network program and Microsoft MS-Networks.
  4033.      2) Partial documentation in Fall 1985 Byte, in Advanced MS-DOS,
  4034.         in the MS-DOS Encyclopedia, LANtastic Programmer's Manual.  
  4035.      3) These services require that the network software be installed.
  4036.      4) SHARE must be loaded or the call will fail.
  4037.      5) The network device name requires a password.
  4038.      6) Only printer and disk devices are supported for redirection.
  4039.         STDAUX, STDIN, STDOUT, and STERR are not supported by the
  4040.         Microsoft/IBM specification.   Other companies have managed
  4041.         to do this with various nonstandard additions to the API.
  4042.  
  4043.  
  4044. Function  60h   Parse pathname  (TRUENAME)     (DOS 3.0+)
  4045.  *              Perform name processing on a string (internal to DOS)
  4046. entry   AH      60h
  4047.         DS:SI   pointer to ASCIIZ source string (null terminated)
  4048.         ES:DI   pointer to destination 80 byte ASCIIZ string buffer
  4049. return  ES:DI   buffer filled with qualified name in form (drive):(path)
  4050.         CF      set     error
  4051.                         AX      error code (02h, 03h)
  4052.                 clear   no error
  4053. note 1) Documented in Zenith 3.05 Technical Reference.
  4054.      2) All name processing is performed on the input string; string
  4055.         substitution is performed on the components, current drive/
  4056.         directories are prepended, .  and ..  are removed.  Under most
  4057.         networking software, the drive letter is replaced with the node
  4058.         name, i.e. returns pathname like \\SERVER\UTILS\TEST.TXT
  4059.         instead of F:\UTILS\TEST.TXT.
  4060.      3) Example: If current drive/directory is C:\TEST,  MYFILE.X is
  4061.         translated to C:\TEST\MYFILE.X; ..\SOURCE\SAMPLE.ASM is 
  4062.         translated to C:\SOURCE\SAMPLE.ASM.
  4063.      4) It is the caller's responsibility to make sure DS:SI does not
  4064.         point to a null string.  If it does, SI is incremented, a null
  4065.         byte is stored at ES:DI, and the routine returns.
  4066.      5) Used by CHKDSK, at least in DOS 3.3, and DOS 3.x.
  4067.      6) If path string is on a JOINed drive, the returned name is the
  4068.         one that would be needed if the drive were not JOINed;
  4069.         similarly for a SUBSTed drive letter.  Because of this, it is
  4070.         possible to get a qualified name that is not legal with the
  4071.         current combination of SUBSTs and JOINs.
  4072.      7) Used by DOS 4.0 SHELLC.EXE.
  4073.      8) This call has been discovered in DOS versions as early as
  4074.         2.11.
  4075.      9) In Novell Netware 2.1x, this call is not supported when the
  4076.         8th bit (high ASCII) is set on any letter in the file or
  4077.         pathname, and when the file being inquired about is on a
  4078.         remote drive.  This causes problems with machines using
  4079.         foreign code pages.
  4080.     10) You need DPMI services to use this call under MS Windows 3.x.
  4081.         There is an example in PC Magazine, 25 June 1991, p. 389
  4082.         called TRUENAME.C.
  4083.  
  4084.  
  4085. Function  61h   undocumented - (DOS 3.0)
  4086.  *              Internal to DOS - parameters not known
  4087. entry   AH      61h
  4088. return  AL      00h
  4089. note    Supposedly documented in Zenith DOS 3.05 Technical Reference.
  4090.  
  4091.  
  4092. Function  62h   Get Program Segment Prefix (PSP) (DOS 3.0+)
  4093. entry   AH      62h
  4094. return  BX      segment address of PSP
  4095. note    Under DOS 3.x+, this function does not use any of DOS' internal
  4096.         stacks and is thus fully reentrant.
  4097.  
  4098.  
  4099. Function  63h   Get Lead Byte Table  (MS-DOS 2.25 only)
  4100.                 Added in DOS 2.25 for additional foreign character
  4101.                 set support.
  4102. entry   AH      63h
  4103.         AL      subfunction
  4104.                 00h     get system lead byte table address
  4105.                 01h     set/clear interim console flag
  4106.                         DL      0000h   to clear interim console flag
  4107.                                 0001h   to set interim console flag
  4108.                 02h     get interim console flag
  4109. return  DS:SI   pointer to lead byte table (AL = 00h)
  4110.         DL      interim console flag (AL = 02h)
  4111. note 1) Function 63h destroys all registers except SS:SP on return.
  4112.         To avoid saving registers repeatedly, a process can copy the
  4113.         table or save the pointer for later use.
  4114.      2) Works ONLY in MS-DOS 2.25!
  4115.      3) Note fn 63h does not return errors in AL or CF.
  4116.      4) Original support was for Kanji (Japanese) and Hanegul (Korean)
  4117.         only.
  4118.      5) The lead byte table contains pairs of bytes that represent the
  4119.         inclusive boundary values for the lead bytes of the specified
  4120.         alphabet.  Because of the way bytes are ordered by the 8086
  4121.         microprocessor family, the values must be read as byte values,
  4122.         not as word values.
  4123.      6) If the interim console flag is set (DL=0001h) by a program
  4124.         through a call to fn 63h, the following int 21h functions
  4125.         return interim character information on request: 07h, 08h,
  4126.         0Bh, 0Ch.
  4127.  
  4128.  
  4129. Function  64h   Undocumented - Used internally by DOS
  4130. entry   AH      64h
  4131. return  unknown
  4132. note 1) DOS 3.2+ internal function of some type? May be a network
  4133.         function.
  4134.      2) In DOS 3.31 it seems that when you load AL with a nonzero
  4135.         number, int 28h will get called more often.  AL=0 resets back
  4136.         to the default "boot up" state.
  4137.  
  4138.  
  4139. Function  65h   Get Extended Country Information (DOS 3.3+)
  4140.                 Returns information about the selected country
  4141.                 formats, code pages, and conversion tables
  4142. entry   AH      65h
  4143.         AL      information ID code
  4144.                 01h     get general internationalization info
  4145.                 02h     get pointer to uppercase table (130 bytes max)
  4146.                         (maps chars 80h-0FFh to their uppercase
  4147.                          equivalents, if any; used mainly to map
  4148.                          accented or other vowels to the corresponding
  4149.                          plain vowels)
  4150.                 03h     unknown
  4151.                 04h     get pointer to filename uppercase table (130
  4152.                         bytes max) (similar to table for AL = 02h)
  4153.    (DOS 5.0+)   05h     get filename character table - specifies which
  4154.                         chars must not be used in filenames.
  4155.                 06h     get pointer to collating sequence table (258
  4156.                         bytes max)  (maps uppercase, lower, and
  4157.                         accented chars together for sorting)
  4158.                 07h     get pointer to double-byte character set table
  4159.    (DOS 5.0+)   20h     convert character - converts character in DL to
  4160.                         uppercase using the current uppercase table
  4161.    (DOS 5.0+)   21h     convert string - converts string in DS:DX,
  4162.                         length CX to uppercase using current uppercase
  4163.                         table, returns in DS:DX
  4164.    (DOS 5.0+)   22h     convert ASCIIZ string - converts string in
  4165.                         DS:DX to uppercase using current uppercase
  4166.                         table, returns in DS:DX
  4167.  
  4168.         BX      code page (0FFFFh = current code page)
  4169.         CX      amount of information to be returned (minimum 5)
  4170.         DX      target country ID (0FFFFh = default current country)
  4171.         ES:DI   segment/offset pointer to country information buffer
  4172. return  CF      set on error
  4173.                 AX      error code (02h)
  4174.                         otherwise:
  4175.         CX      size of country information returned
  4176.         ES:DI   pointer to country information:
  4177.               offset   length   description
  4178.                 00h   1 byte    info ID  (for all following buffers)
  4179.         If information ID code <> 1:
  4180.                 01h     dword  pointer to information
  4181.         If information ID code = 1:
  4182.                 01h     word    length of remainder of buffer (<= 38)
  4183.                 03h     word    country ID
  4184.                 05h     word    code page number
  4185.                 07h  34 bytes   same as for int 21h function 38h
  4186.         If information ID code = 2:
  4187.                 01h     word    table size
  4188.                 05h     dword   pointer to uppercase table
  4189.             128 bytes uppercase equivalents (if any) of chars 80h-0FFh
  4190.         If information ID code = 4:
  4191.                 01h     word    table size
  4192.                 05h     dword   pointer to collating table
  4193.             256 bytes   values used to sort characters 00h-0FFh
  4194.         If information ID code = 6:
  4195.                 01h     word    table size
  4196.                 05h     dword   pointer to filename uppercase table.
  4197.                                 This table starts with a 2-byte length
  4198.                                 field, then 256 ASCII values placed in
  4199.                                 order
  4200.             128 bytes   uppercase equivalents (if any) of chars
  4201.                         80h-0FFh
  4202.         If information ID code = 7: (DOS 4.0)
  4203.                 unknown
  4204. note 1) For AL=02h, 04h, or 06h, the first two bytes of the table
  4205.         give its length and then a 128 byte table of uppercase ASCII
  4206.         characters for 02h or 04h and a pointer to the collating
  4207.         sequence for 06h.
  4208.      2) The country code and code page must match.  If not, error 02h
  4209.         is in AX.
  4210.      3) If more information is provided than was requested by CX, it
  4211.         is truncated without generating an error.
  4212.      4) Country information:
  4213.         bytes   description
  4214.         01h     value of AL (01h)
  4215.         02h,03h size (max = 38)
  4216.         04h,05h country code
  4217.         06h,07h code page
  4218.         08h,09h date format
  4219.         0Ah,0Eh currency symbol
  4220.         0Fh,10h thousands separator
  4221.         11h,12h decimal separator
  4222.         13h,14h date separator
  4223.         15h,16h time separator
  4224.         17h     currency format flags
  4225.         18h     digits in currency
  4226.         19h     time format
  4227.         20h-22h monocase routine entry point
  4228.         23h-24h data list separator
  4229.         25h-29h zeros
  4230.  
  4231.  
  4232. Function  66h   Get/Set Global Code Page Table (DOS 3.3+)
  4233.                 Query/reset code page defaults
  4234. entry   AH      66h
  4235.         AL      00h     Get Global Code Page
  4236.                 01h     Set Global Page
  4237.                         BX      active code page
  4238.                         DX      system code page
  4239.                                 (active page at boot time)
  4240. return  CF      clear  successful
  4241.                 set    AX       error code (unknown)
  4242.         if 00h         BX       active code page
  4243.                        DX       system code page
  4244.                                 (active page at boot time)
  4245. note 1) BX = active code page: 437 = US, 860 = Portugal, 863 = Canada
  4246.                                (French) 865 = Norway/Denmark, 850 =
  4247.                                multilingual
  4248.      2) MS 5.0 TR shows fns as 01h and 02h.
  4249.  
  4250.  
  4251. Function  67h   Set Handle Count  (DOS 3.3+)
  4252.                 Supports more than 20 open files per process
  4253. entry   AH      67h
  4254.         BX      desired number of handles (20 to 65,535)
  4255. return  CF      clear   if OK
  4256.                 set     if error
  4257.                 AX      error code (unknown)
  4258. note 1) This function changes the 20-byte handle table pointer in the
  4259.         PSP to point to a new, larger handle table elsewhere in memory.
  4260.      2) The memory the 67h call allocates is taken from the normal
  4261.         DOS pool, and is reclaimed on process termination, so nothing
  4262.         is lost.
  4263.      3) When calling this function you must release enough memory for
  4264.         DOS to contain the extended handle list.
  4265.      4) If the requested number of handles is less than 20 nothing
  4266.         is done.
  4267.      5) Early versions of PC-MOS/386 v4.1 did not properly deallocate
  4268.         memory when the number of handles was reduced.
  4269.      6) The error value returned in AX is not documented in the IBM
  4270.         4.0 DOS Technical Reference, the MSDOS Encyclopedia or the MS
  4271.         5.0 TR.
  4272.      7) For PC-MOS/386 4.x, the only error code is 08h (insufficient
  4273.         memory).
  4274.  
  4275.  
  4276. Function  68h   Commit File (DOS 3.3+)
  4277.                 Write all buffered data to disk
  4278. entry   AH      68h
  4279.         BX      file handle of previously opened file
  4280. return  CF      clear   successful
  4281.                 set     on error
  4282.                         AX      error code (unknown)
  4283. note 1) Faster and more secure method of closing a file in a network
  4284.         than current close commands.
  4285.      2) This is effectively the same as DUPing the handle for a file
  4286.         and then closing the new one, except that this call won't fail
  4287.         if the system is out of handles.
  4288.      3) The file's buffers are flushed and its directory and FAT
  4289.         entries are updated.
  4290.      4) The error value returned in AX is not documented in the IBM
  4291.         4.0 DOS Technical Reference, the MSDOS Encyclopedia or the MS
  4292.         5.0 TR.
  4293.      5) For PC-MOS/386 4.x, the error codes are 06h (invalid handle)
  4294.         and 22h (wrong disk).
  4295.  
  4296.  
  4297. Function  69h   Disk Serial Number  DOS 4.0+ (US versions)
  4298.                 Handles "Volume Serial Number" on disks formatted with
  4299.                 DOS 4.0+
  4300. entry   AH      69h     Get Volume Serial Number
  4301.         AL      00h     get serial number
  4302.                 01h     set serial number
  4303.         BL      drive (0=default, 1=A, etc)
  4304.         DS:DX   pointer to disk information table
  4305. return  CF      set     on error
  4306.                 AX      error code
  4307.                 clear   if successful
  4308.                 AH      destroyed
  4309.                 AL      (fn 00h) buffer filled with appropriate values
  4310.                                  from extended BPB
  4311.                         (fn 01h) extended BPB on disk set to values
  4312.                                  from buffer
  4313.         DS:DX   disk information table. Format:
  4314.                 offset  size    description
  4315.                 00h     word    unknown (zeroes on my system)
  4316.                 02h    dword    disk serial number (binary)
  4317.                 06h 11 bytes    volume label or "NO NAME    " if none
  4318.                 11h  8 bytes    FAT type - string "FAT12   " or
  4319.                                 "FAT16   "
  4320. note 1) The FAT type field refers to the number of bits per directory
  4321.         entry.
  4322.      2) Does not generate a critical error; all errors are returned
  4323.         in AX.
  4324.      3) Error 0005h given if no extended BPB on disk.
  4325.      4) Does not work on network drives (error 0001h).
  4326.      5) Buffer after first two bytes is exact copy of bytes 27h thru
  4327.         3Dh of extended BPB on disk.
  4328.      6) FORMAT (in DOS 5.0) does not call int 21h/fn 69h. (Get/Set 
  4329.         Volume Serial Number)  For floppy disks, it calls int 21h/fn 
  4330.         440Dh, CH=08, CL=46 [Set Media ID], and passes the serial 
  4331.         number.   (from dsparks, BIX) 
  4332.  
  4333.  
  4334. Function  6Ah   Unknown  (DOS 4.0?)
  4335.  
  4336.  
  4337. Function  6Bh   Unknown  (DOS 4.0?)
  4338.  
  4339.  
  4340. Function  6Ch   Extended Open/Create  DOS 4.0+ (US)
  4341.                 Combines functions available with Open, Create, Create
  4342.                 New, and Commit File
  4343. entry   AH      6Ch
  4344.         AL      00h  reserved  [which means there might be other
  4345.                                 subfunctions?]
  4346.         BX      mode    format  0WF0 0000 ISSS 0AAA
  4347.                                 AAA is access code (read, write,
  4348.                                                     read/write)
  4349.                                 SSS is sharing mode
  4350.                                 I       0       pass handle to child
  4351.                                         1       no inherit [interesting!]
  4352.                                 F       0       use int 24h for errors
  4353.                                         1       disable int 24h for all
  4354.                                                 I/O on this handle; use
  4355.                                                 own error routine
  4356.                                 W       0       no commit
  4357.                                         1       auto commit on all writes
  4358.         CX      create attribute
  4359.            bits 0       read only
  4360.                 1       hidden
  4361.                 2       system
  4362.                 3       volume label
  4363.                 4       reserved
  4364.                 5       archive
  4365.                 6-15    reserved
  4366.         DH      00h (reserved)
  4367.         DL      action if file exists/does not exists
  4368.            bits 0-3     action if file exists
  4369.                         0000    fail
  4370.                         0001    open
  4371.                         0010    replace/open
  4372.                 4-7     action if file does not exist
  4373.                         0000    fail
  4374.                         0001    create
  4375.         DS:SI   pointer to ASCIIZ file name
  4376. return  CF      set on error
  4377.                 AX      error code (unknown)
  4378.                 clear
  4379.                 AX      file handle
  4380.                 CX      action taken
  4381.                         01h     file opened
  4382.                         02h     file created/opened
  4383.                         03h     file replaced/opened
  4384. note    When APPEND is installed, if DX=xx1x it looks only in current
  4385.         directory, if DX=xx0x it will search the full append path.
  4386.         DX is called the open flag and gives what action to take if
  4387.         the file exists or does not exist.
  4388.  
  4389.  
  4390. Function  89h   undocumented - DOS_Sleep
  4391.  *              Not documented by Microsoft
  4392. entry   AH      89h
  4393. return  unknown
  4394. note 1) Function included in Microsoft C 4.0 startup code MSDOS.INC.
  4395.      2) Debugging shows that the first instruction on entry to DOS
  4396.         compares AH with 64h (at least in DOS 3.2) and aborts the
  4397.         call if AH > 64.
  4398.      3) Possibly used in European MSDOS 4.0?
  4399.  
  4400.  
  4401.  
  4402. Aftermarket Application Installed Function Calls:
  4403.  
  4404. Novell Netware 2.11:
  4405.         Novell no longer recommends the int 21h method for invoking
  4406.         the Netware functions.  Int 21h will be supported
  4407.         indefinitely, but the new net API calls for addressing the
  4408.         software through the Multiplex Interrupt (2Fh).  You may
  4409.         address the API through int 2Fh in the same manner as int 21h;
  4410.         only the interrupt number is different.
  4411.  
  4412.         Novell API calls are referenced in Chapter 13.  Most functions
  4413.         from 0B6h through 0F9h are preempted by NetWare; if your
  4414.         software uses any of these calls for another purpose it will
  4415.         likely not run under NetWare.
  4416.  
  4417. NOTE:   Novell (and most others') network software and SoftLogic's
  4418.         DoubleDOS conflict on the following int 21h functions
  4419.         0EAh-0EEh.  Netware must use int 2Fh functions instead of 21h
  4420.         functions if DoubleDOS will be used on the network.
  4421.  
  4422.  
  4423. Functions 0E0h - 0F6h: used by AI Architects/Ergo Computing
  4424.           DOS extender
  4425.  
  4426.  
  4427. Functions 0E4h - 0EEh: used by DoubleDOS task switcher
  4428.  
  4429.  
  4430. Function  0FEh  Enable Reader v4.0 API
  4431.                 Enable Reader is a speech synthesizer interface for
  4432.                 the blind.  It will save all registers except the
  4433.                 flags, where the zero flag will be set if the call was
  4434.                 not one of the available Enable Reader 4.0 functions.
  4435.  
  4436. entry   AH      0FEh
  4437.         AL      01h     Driver Output
  4438.         DL      Character To Output
  4439. return  none
  4440. note    The Driver Output call will output the character in DL through
  4441.         the Enable Reader driver, without turning off the Help
  4442.         Functions.  It will be filtered by the ASCII sort routine in
  4443.         the Enable Reader Driver, and if it is punctuation it will be
  4444.         sent according to the level of punctuation selected.
  4445.  
  4446. entry   AH      0FEh
  4447.         AL      02h     Direct Output
  4448.         DL      ASCII character to output
  4449. return  none
  4450. note    The Direct Output call will send the byte in DL directly to
  4451.         the synthesizer, bypassing the Enable Reader driver and ASCII
  4452.         filter sort routine.
  4453.  
  4454. entry   AH      0FEh
  4455.         AL      03h     Message Output
  4456.         DL      character to output
  4457. return  none
  4458. note    The Message Output call allows character filtration and
  4459.         punctuation, but turns off the Help functions in the driver.
  4460.  
  4461. entry   AH      0FEh
  4462.         AL      41h (ASCII A) Auto
  4463. return  none
  4464. note    The AUTO call turns the Spell mode on or off.
  4465.  
  4466. entry   AH      0FEh
  4467.         AL      4Eh (ASCII N) Punctuation Levels
  4468. return  none
  4469. note    This call selects one of five Punctuation Character Sets that
  4470.         can be accessed.  The fifth level is "Output Punctuation",
  4471.         which allows all ASCII characters to be sent to the synthesizer
  4472.         without being filtered or translated into the Enable Reader 4.0
  4473.         Punctuation Words.
  4474.  
  4475. entry   AH      0FEh
  4476.         AL      4Fh (ASCII O) Help Word Levels
  4477. return  none
  4478. note    The Help call selects one of four levels of help. By selecting
  4479.         "No Help" at the start of your program, you can use the other
  4480.         Help Functions without having them speak their prompts.
  4481.  
  4482. entry   AH      0FEh
  4483.         AL      51h (ASCII Q) Quit
  4484. return  none
  4485. note    This call will stop the synthesizer from speaking.
  4486.  
  4487. entry   AH      0FEh
  4488.         AL      5Ah (ASCII Z) Letter-to-Word Translator
  4489. return  none
  4490. note    This call turns the Letter-To-Word Translator on or off.
  4491.   For a discussion on the TRANSLATOR Function, read
  4492.  
  4493. entry   AH      0FEh
  4494.         AL      54h (ASCII T) Upper Case Identification
  4495. return  none
  4496. note    This call toggles identification of uppercase letters.
  4497.  
  4498. entry   AH      0FEh
  4499.         AL      56h (ASCII V) Video Output
  4500. return  none
  4501. note    The Video Output call toggles the output to the synthesizer
  4502.         from data that is printed on the video screen.
  4503.  
  4504.  
  4505. Function  0FFh  CED   (CJ Dunford's DOS macro and command-line editor)
  4506.                 CED installable commands
  4507. entry   AH      0FFh
  4508.         AL      00h     Add Installable Command
  4509.                 01h     Remove Installable Command
  4510.                 02h     Reserved, may be used to test for CED
  4511.                         installation
  4512.         BL      mode byte
  4513.             bit 0       callable from DOS prompt
  4514.                 1       callable from application
  4515.                 2-7     not used in public domain CED
  4516.         DS:SI   pointer to CR-terminated command name
  4517.         ES:DI   pointer to far routine entry point
  4518. return  CF      set on error
  4519.         AX      01h     invalid function
  4520.                 02h     command not found (subfunction 1 only)
  4521.                 08h     insufficient memory (subfunction 0 only)
  4522.                 0Eh     bad data (subfunction 0 only)
  4523.         AH      0FFh    if CED not installed
  4524. note 1) When PCED returns, AX and the flags are changed.  Other
  4525.         registers are preserved, except as noted.
  4526.  
  4527.